Подтвердить что ты не робот

Entity Framework 4 - Сопоставление непубличных свойств с CTP5 (сначала код) в постоянном невнимательном контексте

Я знаю, что у вопроса уже есть решение (например, этот вопрос), но я действительно не могу позволить себе привязать логику сопоставления в той же сборке, где домен (Классы POCO).

Есть ли другой способ?

Я нашел этот хороший пост в блоге, но я не мог заставить его работать. Вот модель:

public class Institute
{
    /**
        Code omitted
    **/

    protected virtual ICollection<InstituteText> InnerInstituteTexts { get; set; }

    private InstituteTextSet _TextSets;

    public InstituteTextSet Texts 
    {
        get 
        {
            if (_TextSets == null)
                _TextSets = new InstituteTextSet(InnerInstituteTexts);

            return _TextSets;
        }
    }
}

Код отображения:

var instituteTextExpression = ObjectAccessor<Institute>.CreateExpression<ICollection<InstituteText>>("InnerInstituteTexts");

institute.HasMany(instituteTextExpression)
    .WithRequired()
    .HasForeignKey(t => t.InstituteId);

где CreateExpression определяется как:

public static Expression<Func<T, TResult>> CreateExpression<TResult>(string propertyOrFieldName)
{
    ParameterExpression param = Expression.Parameter(typeof(T), "propertyOrFieldContainer");
    Expression body = Expression.PropertyOrField(param, propertyOrFieldName);
    LambdaExpression lambda = Expression.Lambda(typeof(Func<T, TResult>), body, param);

    return (Expression<Func<T, TResult>>) lambda;
}

я получаю ошибку:

Метод инициализации Studentum.Core.Tests.InstituteTests.Initialize бросил исключение. System.TypeInitializationException: System.TypeInitializationException: Инициализатор типа для 'Studentum.Core.FluentCoreRepositoryFactory' бросил исключение. --- > System.InvalidOperationException: настроенное свойство "InnerInstituteTexts" не является объявленное свойство на объекте "Институт". Убедитесь, что он не были явно исключены из модели и что это действительный примитив свойство..

4b9b3361

Ответ 1

Первое, что пришло в голову, - это атрибут InternalsVisibleTo. Это позволяет вам называть сборки "друг", которые также имеют доступ к внутренним членам. Я не был уверен, будет ли это работать с EF CodeFirst, но я попробовал его, и он работает нормально. Вам придется немного изменить структуру модели, но я думаю, что это разумное изменение.

Сначала вам нужно изменить объявление свойства на защищенный внутренний:

 protected internal virtual ICollection<InstituteText> InnerInstituteTexts { get; set; }

Затем в вашей сборке моделей добавьте атрибут сборки InternalsVisibleTo в файле AssemblyInfo.cs с именем вашей сборки сопоставления.

[assembly: InternalsVisibleTo("MappingAssemblyName")]

Наконец, вы можете определить ваше сопоставление свойства в сборке сопоставления, как и любое другое общедоступное свойство.

institute.HasMany(i => i.InnerInstituteTexts)
    .WithRequired()
    .HasForeignKey(t => t.InstituteId);