实体框架、POCO 和私有属性
本文关键字:属性 POCO 框架 实体 | 更新日期: 2023-09-27 18:30:50
我创建了以下 POCO 类,并将Contact.FirstName
和Contact.LastName
属性设为私有(这些属性映射到实体框架模型中的相应属性)。
public class Contact
{
public int ContactID { get; set; }
private string FirstName { get; set; }
public string LastName { get; private set; }
}
由于 EF 无法为这两个属性分配值,我希望得到异常,但不知何故,EF 仍然设法为它们分配值。这怎么可能,因为只有类Contact
中的代码才能访问私有属性?
谢谢
在具有足够信任级别的环境中,反射可用于访问通常无法访问的成员。
为了完整起见:EF5 代码首先不会(至少在默认情况下)将私有属性映射到数据库表列。
以下类:
public class Person {
public int PersonId { get; set; }
private string Name { get; set; }
}
使用以下 DbContext:
public class PrivatePropertiesContext : DbContext {
public DbSet<Person> People {
get;
set;
}
}
生成仅包含一列的 People 表:dbo.People.PersonId (PK, int, not null)
默认情况下,代码优先约定需要公钥属性。如果 Person 类中的 PersonId
属性是私有的或受保护的,则实体框架将引发以下异常:
System.Data.Entity.Edm.EdmEntityType: : EntityType 'Person' has no key defined. Define the key for this EntityType.
System.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'People' is based on type 'Person' that has no keys defined.
是的
- EF,代码首先在几个地方使用它。
我在私有构造函数中看到过类似的行为 - EF/CF 仍然可以构造您的对象,即使您"隐藏"它或尝试:)(这是早期版本中的行为,现在不确定)。
我记得很久以前就与 CF 人员讨论过为什么他们不初始化复杂类型属性 - 与他们仍然可以访问私有成员(如果我没记错的话)相比。
所以,有点一般性的问题 - 但从这个意义上说,希望这至少澄清了一些事情。