Я не верю, что подобное поддерживается в Entity Framework, поскольку сложные типы предназначены для поддержки организации свойств одной таблицы в связанные классы без реляционных таблиц. В вашем случае вы хотели бы взять реляционные таблицы и отобразить промежуточный класс, чтобы избежать правил управления дочерней коллекцией в родительском классе.
Один из вариантов, который я могу предложить, чтобы помочь преодолеть разделение интересов, которое, по-видимому, вы хотели бы иметь между вашими классами, - это использовать методы расширения для логики для конкретной коллекции, которую вы хотите раскрыть для Дневника.
Например:
[Table("Requests")]
public class Request
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int RequestId { get; set; }
public string Name { get; set; }
public virtual IEnumerable<DiaryEntry> Diary { get; protected set; } = new List<DiaryEntry>();
}
[Table("DiaryEntries")]
public class DiaryEntry
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int DiaryEntryId { get; set; }
public string Value { get; set; }
public virtual Request Request { get; set; }
}
Здесь мы представляем Дневник как IEnumerable<DiaryEntry>
, поэтому потребители объекта не могут изменять коллекцию и т. Д. Оттуда функциональность дневника может управляться расширениями:
public static class DiaryExtensions
{
public static DiaryEntry AddEntry(this IEnumerable<DiaryEntry> diary, DiaryEntry newEntry)
{
ICollection<DiaryEntry> diaryList = (ICollection<DiaryEntry>)diary;
if (newEntry != null)
diaryList.Add(newEntry);
return newEntry;
}
}
Лично, хотя у меня была бы эта логика в Запросе, поскольку записи в дневнике связаны с запросом. Чтобы отделить логику, специфичную для дневника, я бы использовал частичные классы, но сохраняя ответственность за поддерживаемое поведение в классе, который их содержит.