gpt4 book ai didi

.net - EF 4.0 - 映射到具有私有(private)字段的只读属性

转载 作者:行者123 更新时间:2023-12-04 01:03:17 27 4
gpt4 key购买 nike

是否可以使用 EF 4.0 映射以下 POCO 类?

public class MyClass
{
private string _myData;

public MyClass()
{ }

public MyClass(string myData)
{
_myData = myData;
}

public string MyData
{
get
{
return _myData;
}
}
}

在 NHibernate 中,我认为在映射中使用 Access 属性是可能的,例如:
<class name="MyClass" table="MyTable">
<property name="MyData" access="field.camelcase-underscore" column="MyCol" type="string" length="50" />
</class>

我想知道 EF 4.0 中是否有一些 Access 等价物?目前,只有在将 protected setter 添加到 MyData 属性时,我才能映射该类:
  public string MyData
{
get
{
return _myData;
}
protected set
{
_myData = value;
}
}

它可以工作,但对于遗留类,这意味着更新所有没有 setter 的属性。

编辑:

我更新了最后一个代码示例,因为它也不适用于私有(private) setter 。 Setter 必须至少受到保护。如果 setter 是私有(private)的或不存在,则抛出以下异常:

System.InvalidOperationException: Mapping and metadata information could not be found for EntityType 'MyNamespace.MyClass'.

最佳答案

这是针对 Code First POCO 对象的,以帮助 Shimmy 和其他想知道这一切如何与 Code First 一起工作的人

我认为您可能只是不了解 Entity Framework 的工作原理。这也花了我一段时间来掌握。

Entity Framework 通过使用代理类对您的 POCO 对象进行子类化来工作,该代理类用于序列化和反序列化您的对象。这意味着如果您有一个私有(private)的 set 方法或属性(或者它一起丢失),则子类方法无法设置该属性。您希望 Entity Framework 使用的 setter 和属性必须是 protected 或公共(public)的。

如果您希望延迟加载复杂的属性,您还必须将这些属性设为虚拟,以便 Entity Framework 也可以代理这些属性。如果你想预先加载它们,你必须使用 Include 方法。

要完全回答您的问题,是的,您必须将 setter 属性添加到您希望 Entity Framework 为您设置的所有属性中。不,Entity Framework 没有为您提供映射没有 setter 的属性的方法。

NHibernate 的工作方式有点不同,它覆盖了你所有的属性,我相信它在它生成的子类中使用私有(private)变量,设置私有(private)变量,然后被覆盖的属性返回私有(private)变量。 A.K.A.,NHibernate 不需要属性本身的 setter ,而 Entity Framework 实际上设置了属性。 Entity Framework 这样做的好处是它返回您创建的实际 POCO 对象,而不是像 NHibernate 这样的子类对象。您获得子类对象的唯一时间是使用延迟加载的复杂属性时,Entity Framework 返回代理子类。当您实际检索数据时,代理再次将自己设置为您的 POCO 类。

您的二传手应该是公开的或 protected ,就像您在问题中所说的那样:

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;
}
}
}

关于.net - EF 4.0 - 映射到具有私有(private)字段的只读属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3574333/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com