Entity Framework 4 - Отображение непубличных свойств с помощью CTP5 (сначала код) в постоянном незаметном контексте - PullRequest
12 голосов
/ 09 марта 2011

Я знаю, что вопрос уже имеет решение (например, этот вопрос ), но я действительно не могу позволить присоединить логику отображения в той же сборке, где находится домен (классы 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' не является объявленным свойством для объекта 'Institute'.Убедитесь, что он не был явно исключен из модели и является допустимым примитивным свойством.

1 Ответ

8 голосов
/ 16 сентября 2011

Первое, что пришло в голову, это атрибут сборки 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);
...