0

我在一个实体中看到了一些奇怪的行为,我为此创建了一个部分类来覆盖 ToSting 方法并在创建该实体的新实例时提供一些基本属性设置(例如,我可能将订单日期设置为'现在')在构造函数中。

这种奇怪的行为让我仔细观察了部分类,我惊讶地发现,即使在检索一组预先存在的记录时,也会为每个检索到的记录调用构造函数。

下面是我可能拥有的一个非常简单的示例:

Partial Public Class Product


Public Sub New()

    CostPrice = 0.0
    ListPrice = 0.0 

End Sub
Public Overrides Function ToString() As String
    Return ProductDescription
End Function
End Class

我有两个问题由此产生:

1)如果您添加一个向其添加构造函数的部分类,这是实体框架中的正常行为吗?

2)如果不是,那么我必须假设我做错了什么,那么覆盖构造函数以执行类似于我上面提到的示例的正确方法是什么?

感谢您能给我的任何见解。

这是在 vb 项目中使用 EF 5.0

4

2 回答 2

1

考虑导致从数据库中检索实体的事件序列。基本上它应该是这样的:

  • 查询数据库
  • 为查询结果的每一行给出一个实体

然后,对于每个检索到的行,给予如下:

  • 创建检索到的实体的新实例
  • 用该行的值填充这个新实例

每次创建实例时,都会调用构造函数。

我认为您正在混合:

  • 您“分配”对象的实例初始化,以及
  • 执行业务逻辑的业务初始化

两者都可以至少部分在构造函数中完成。

于 2013-07-23T10:22:25.517 回答
0

new总是在第一次实例化类时调用,如果您没有显式声明构造函数,则编译器将创建一个默认构造函数

除非类是静态的,否则 C# 编译器会为没有构造函数的类提供公共默认构造函数,以启用类实例化。

为 Entity Framework 定义 POCO 类时,该类必须具有默认构造函数,并且无论您已明确定义它还是编译器为您完成,EF 都会始终调用此默认构造函数。

如果出于任何原因需要在实例化时将任何内容传递给类,则可以使用ObjectContext.ObjectMaterializedevent

于 2013-07-23T10:31:03.077 回答