为什么在使用实体框架时为每个检索到的记录调用“新建”

时间:2013-07-23 09:56:25

标签: vb.net entity-framework

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

每个检索到的行的给出如下:

  • 创建检索到的实体的新实例
  • 使用行
  • 的值填充此新实例

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

我认为你在混音:

  • 实例初始化你在哪里"分配"对象,和
  • 执行业务逻辑的业务初始化

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

答案 1 :(得分:0)

首次实例化类时始终调用

new,如果没有显式声明构造函数,则调用default constructor will be created by the compiler

  

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

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

如果出于任何原因,您需要在实例化时将任何内容传递给类,您可以use the ObjectContext.ObjectMaterialized event