8

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

谢谢

4

3 回答 3

17

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

于 2012-04-12T17:59:35.473 回答
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;
  }
}

生成只有一列的 People 表:dbo.People.PersonId (PK, int, not null)

默认情况下,代码优先约定需要公钥属性。如果PersonIdPerson 类中的属性是私有的或受保护的,实体框架会抛出以下异常:

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.
于 2013-03-05T13:57:30.490 回答
0

是的 - EF,代码优先在几个地方使用它。

我已经看到私有构造函数的类似行为——即使你“隐藏”它,EF/CF 仍然可以构造你的对象,或者尝试:)(这是早期版本中的行为,现在不确定)。

而且我记得与 CF 人员讨论过他们为什么不初始化复杂类型的属性 - 而他们仍然可以访问私有成员(如果我没记错的话),这是很久以前的事了。

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

于 2012-04-12T18:29:32.460 回答