2014-01-11 1 views
2

Я пытаюсь отобразить набор объектов с непубличным свойством, чтобы лучше инкапсулировать мой домен, поскольку сущность, содержащая коллекцию, должна обеспечивать соблюдение определенных правил в коллекции, например.Как сопоставить непубличные свойства коллекции с Entity Framework Code First?

public class Foo 
    { 
     public AddBar(Bar bar) 
     { 
      if (BarsInternal.Count > 4) 
      { 
       throw new Exception("Too many Bars!"); 
      } 
      BarsInternal.Add(bar); 
     }   

     public IEnumerable<Bar> Bars 
     { 
      get { foreach (var bar in BarsInternal) { yield return bar; } } 
     } 

     internal virtual IList<Bar> BarsInternal { get; set; } 

    } 

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

Однако для коллекций я не могу заставить это работать. Если я объявляю публикацию собственности и использую следующее картографирование:

public class FooMap : EntityTypeConfiguration<Foo> 
{ 
    public FooMap() 
    { 
     this.HasMany(x => x.BarsInternal); 
    } 
} 

Затем все работает.

Однако, если изменить Bars свойство быть внутренним, то я получаю следующее странное поведение:

  • таблиц базы данных создаются, как и ожидалось (с использованием кода первые миграции), а также внешние ключи и все выравнивается, поэтому структура сущности, по-видимому, считывает внутреннее свойство каким-то образом.
  • Первый перенос кода с использованием context.Foos.AddOrUpdate(fooInstance) полностью сохраняет коллекцию Bars в базе данных, как и ожидалось.
  • Но, при извлечении Foo из контекста, Bars коллекция всегда пустой.

Как я могу правильно сопоставить свойство непубличной коллекции в Entity Framework Code?

ответ

3

Изменить модификаторы доступа BarsInternal от internal до protected internal и он будет работать правильно.

Я подозреваю, что причиной этого является то, что инфраструктура сущности использует прокси-серверы за сценой для коллекций, а прокси-серверы могут «тенеировать» свойство коллекции, если они могут его переопределить.

 Смежные вопросы

  • Нет связанных вопросов^_^