Lad*_*nka 12 .net mapping entity-framework entity-framework-4
是否可以使用EF 4.0映射以下POCO类?
public class MyClass
{
  private string _myData;
  public MyClass() 
  { }
  public MyClass(string myData)
  {
    _myData = myData;
  }
  public string MyData
  {
    get
    {
      return _myData;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)
在NHibernate中我认为在映射中使用Access属性是可能的:
<class name="MyClass" table="MyTable">
  <property name="MyData" access="field.camelcase-underscore" column="MyCol" type="string" length="50" />
</class>
Run Code Online (Sandbox Code Playgroud)
我想知道EF 4.0中是否有一些Access等价物?目前,我能够映射类只如果我添加受保护的setter到MyData的属性:
  public string MyData
  {
    get
    {
      return _myData;
    }
    protected set
    {
      _myData = value;
    }
  }
Run Code Online (Sandbox Code Playgroud)
它可以工作,但对于遗留类,它意味着更新所有没有setter的属性.
编辑:
我已经更新了最后一个代码示例,因为它也不适用于私有setter.塞特必须至少受到保护.如果setter是私有的,或者在抛出异常后不存在:
System.InvalidOperationException:映射和元数据信息无法进行的EntityType"MyNamespace.MyClass"中找到.
这是针对Code First POCO对象,帮助Shimmy和其他人想知道这一切是如何与Code First一起工作的
我认为您可能只是不了解实体框架的工作原理.这花了我一点时间才掌握.
实体框架通过使用代理类对POCO对象进行子类化来工作,代理类用于序列化和反序列化对象.这意味着如果您有私有set方法或属性(或者它们一起丢失),则子类方法无法设置该属性.您希望实体框架使用的setter和属性必须是受保护的或公共的.
如果您希望懒惰地加载复杂属性,则还必须创建这些虚拟属性,因此Entity Framework也可以代理这些属性.如果您想要加载它们,则必须使用Include方法.
要完全回答您的问题,是的,您必须将setter属性添加到您希望Entity Framework为您设置的所有属性中.不,实体框架不提供映射没有setter的属性的方法.
NHibernate的工作方式略有不同,它覆盖了所有属性,我相信它在它生成的子类中使用私有变量,设置私有变量,然后重写的属性返回私有变量.AKA,NHibernate不需要在属性本身上设置setter,而Entity Framework实际上设置了属性.实现此功能的实体框架的好处是它返回您创建的实际POCO对象,而不是NHibernate之类的子类对象.获得子类化对象的唯一时间是使用延迟加载的复杂属性,其中Entity Framework返回代理子类.当您实际检索数据时,代理会再次将自己设置为您的POCO类.
您的二传手应该是公开的或受到保护的,就像您在问题中提到的那样:
public class MyClass
{
    private string _myData;
    public MyClass() { }
    public MyClass(string myData)
    {
        // In case there is specialized logic, you should call the property setter here
        // unless the property is a virtual property. You should never call any virtual
        // methods or properties in your constructor.
        MyData = myData;
    }
    public string MyData
    {
        get
        {
            return _myData;
        }
        protected set
        {
            _myData = value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
        我玩了这一点,我的结论是: