我创建了以下POCO类,并将Contact.FirstName
和Contact.LastName
属性设为私有(这些属性映射到Entity Framework模型中的相应属性)。
public class Contact
{
public int ContactID { get; set; }
private string FirstName { get; set; }
public string LastName { get; private set; }
}
由于EF无法为这两个属性赋值,我预计会遇到异常,但不知何故,EF仍设法为它们分配值。这怎么可能,因为只有Contact
类中的代码才能访问私有属性?
谢谢
答案 0 :(得分:16)
在具有足够信任级别的环境中,reflection可用于访问通常无法访问的成员。
答案 1 :(得分:1)
为了完整起见: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;
}
}
生成只包含一列的人员表: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.
答案 2 :(得分:0)
是的 - EF,代码首先在几个地方使用它。
我见过与私有构造函数类似的行为 - 即使你“隐藏”它,或者尝试:),EF / CF仍然可以构造你的对象(这是早期版本中的行为,现在不确定)。
我记得和CF人讨论过为什么他们没有初始化复杂类型的属性 - 他们仍然可以访问私人成员(如果我没记错的话),很久以前。
所以,这是一个普遍的问题 - 但在这个意义上希望这至少可以澄清一些问题。