实体框架、POCO 和私有属性

本文关键字:属性 POCO 框架 实体 | 更新日期: 2023-09-27 18:30:50

我创建了以下 POCO 类,并将Contact.FirstNameContact.LastName属性设为私有(这些属性映射到实体框架模型中的相应属性)。

public class Contact
{
    public int ContactID { get; set; }
    private string FirstName { get; set; }
    public string LastName { get; private set; }
}
由于 EF 无法为这两个属性分配值,

我希望得到异常,但不知何故,EF 仍然设法为它们分配值。这怎么可能,因为只有类Contact中的代码才能访问私有属性?

谢谢

实体框架、POCO 和私有属性

在具有足够信任级别的环境中,反射可用于访问通常无法访问的成员。

为了完整起见: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 人员讨论过为什么他们不初始化复杂类型属性 - 与他们仍然可以访问私有成员(如果我没记错的话)相比。

所以,有点一般性的问题 - 但从这个意义上说,希望这至少澄清了一些事情。