Это для объектов Code First POCO, чтобы помочь Шимми и другим, интересующимся, как все это работает с Code First
Я думаю, что вы, возможно, просто не понимаете, как работает Entity Framework,Мне тоже потребовалось некоторое время, чтобы понять.
Entity Framework работает путем создания подклассов ваших объектов POCO с помощью прокси-класса, который используется для сериализации и десериализации ваших объектов.Это означает, что если у вас есть закрытый метод или свойство set (или все вместе отсутствует), то у подклассового метода не будет возможности установить свойство.Установщики и свойства, которые вы хотите использовать в Entity Framework, ДОЛЖНЫ быть либо защищенными, либо общедоступными.
Если вы хотите, чтобы ваши сложные свойства загружались лениво, вы также должны сделать их виртуальными, чтобы Entity Framework мог использовать их какЧто ж.Если вы хотите загружать их, вы должны использовать метод Include.
Чтобы полностью ответить на ваш вопрос, да, вы должны пойти и добавить свойства сеттера ко всем вашим свойствам, которые вы хотите EntityРамки для вас.Нет, Entity Framework не предоставляет способ сопоставления свойств, которые не имеют установщика.
NHibernate работает немного по-другому, поскольку он переопределяет все ваши свойства, и я считаю, что он используетзакрытые переменные в подклассах, которые он генерирует, устанавливают закрытые переменные, а переопределенные свойства возвращают закрытые переменные.AKA, NHibernate не нуждается в установщике самого свойства, тогда как Entity Framework фактически устанавливает свойство.Преимущество Entity Framework в этом состоит в том, что он возвращает фактический созданный вами объект POCO, а не подклассный объект, такой как NHibernate.Единственный раз, когда вы получаете подклассный объект, это когда вы используете лениво загруженные сложные свойства, когда Entity Framework возвращает прокси-подкласс.Когда вы на самом деле извлекаете данные, прокси-сервер снова устанавливает свой класс POCO.
Ваш установщик должен быть общедоступным или защищенным, как у вас в вопросе:
public class MyClass
{
private string _myData;
public MyClass() { }
public MyClass(string myData)
{
// In case there is specialized logic, you should call the property setter here
// unless the property is a virtual property. You should never call any virtual
// methods or properties in your constructor.
MyData = myData;
}
public string MyData
{
get
{
return _myData;
}
protected set
{
_myData = value;
}
}
}