【问题标题】:Entity framework, POCO and a private property实体框架、POCO 和私有属性
【发布时间】:2012-04-25 02:58:15
【问题描述】:

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

谢谢

【问题讨论】:

  • 实体框架很神奇。它可以为所欲为。
  • 你有映射代码吗?在没有显式配置(或 EF 4.3 中的注释)的情况下映射私有属性实际上应该不会那么容易:blog.oneunicorn.com/2012/03/26/…
  • @Slauma:我使用的是数据库优先方法

标签: c# entity-framework poco


【解决方案1】:

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

【讨论】:

  • 所以这也是测试项目能够访问私人成员的方式?
  • @dbaseman:是的,但也有一个InternalsVisibleAttribute,有时被测试代码使用它来使其internal 成员可以被单元测试访问,而根本不需要反射。
  • 这里是 OOP 的新手——“足够的信任级别”有具体的含义吗? (特别是,我如何在我的代码中表明我是否“信任”某些库/框架代码?)
【解决方案2】:

为了完整起见: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.

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-10-28
      • 2012-03-08
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      相关资源
      最近更新 更多