实体框架,POCO和私有财产

时间:2012-04-12 17:56:50

标签: c# entity-framework poco

我创建了以下POCO类,并将Contact.FirstNameContact.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类中的代码才能访问私有属性?

谢谢

3 个答案:

答案 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人讨论过为什么他们没有初始化复杂类型的属性 - 他们仍然可以访问私人成员(如果我没记错的话),很久以前。

所以,这是一个普遍的问题 - 但在这个意义上希望这至少可以澄清一些问题。