Я пытаюсь отобразить набор объектов с непубличным свойством, чтобы лучше инкапсулировать мой домен, поскольку сущность, содержащая коллекцию, должна обеспечивать соблюдение определенных правил в коллекции, например.Как сопоставить непубличные свойства коллекции с 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?