5

我见过类似的问题,但他们不是我所指的(或者他们是,我不明白答案)实体框架参数化/重载的构造函数?

在我以前的应用程序使用Linq2SQL我能够重载构造函数与参数通过这样做:

Namespace CoreDb  
    Partial Public Class Accomplishment 

    Public Sub New(ByVal accomplishmentTypeID As Object, ByVal description As String, ByVal title As String, ByVal applicableDate As DateTime, ByVal lastUpdatedBy As String) 
     Me.New() 

     If TypeOf (accomplishmentTypeID) Is Guid Then 
      Me.AccomplishmentTypeId = accomplishmentTypeID 
     End If 

     If TypeOf (accomplishmentTypeID) Is String Then 
      Me.AccomplishmentTypeId = New Guid(accomplishmentTypeID.ToString()) 
     End If 

     Me.Description = description 
     Me.ApplicableDate = applicableDate 
     Me.Title = title 
     Me.Id = Guid.NewGuid() 
     Me.DateCreated = DateTime.Now 
     Me.DateModified = DateTime.Now 
     Me.LastUpdatedBy = lastUpdatedBy 
     Me.CreatedBy = lastUpdatedBy 
    End Sub 
End Class 
End Namespace 

基本上使用禁用对象的部分类,共享.dbml文件的命名空间,并调用默认的构造函数,然后做更多的东西。

所以后来在我的代码,我可以这样做:

Dim accomplishment As New Accomplishment(id, description, title, applicableDate, lastUpdatedBy) 

这似乎是在实体框架不再工作,因为没有默认的构造函数调用。

这不工作?如果是的话,执行这样的事情有什么好的选择?

回答

9

没有任何生成的默认构造函数,但这并不意味着它没有。但是当你定义了一个构造函数,该构造函数的参数在没有明确设置无参数构造函数的类中时,它将隐藏缺省构造函数。

所以在你的部分类中,你只需要定义一个无参数的构造函数。

+3

+1事实上,你*有*做到这一点,否则EF将无法实例化您的类时,实现您的查询! – 2011-03-17 16:49:10

+0

您是否看过Designer文件以查看构造函数是什么?如果你没有默认的构造函数,你如何创建一个'Accomplishment'的实例?所以必须有一个默认的构造函数。 – 2011-03-17 16:49:26

+0

@Thomas:没有明确创建的默认构造函数。正如@Frant所说的,你必须定义一个简单的空无参数构造函数**来调用基础构造函数**。 – 2011-03-17 16:50:22

2

在本文的EF当前版本中,虽然您确实需要无参数构造函数,但它似乎可以在无参数构造函数下正常工作。所以你可以这样做:

Public Class Customer 

    ' only usable by EF 
    Private Sub New() 
    End Sub 

    ' what you or your class consumers will use 
    Public Sub New(firstName As String, lastName As String) 
     Me.New() 
     ' assign properties, etc. 
    End Sub 

    ' etc. 

End Class 
+0

如果将无参数构造函数设为私有,则会遇到延迟加载的问题。请参阅MSDN文档中的[POCO代理的必需条件] [1]: >自定义数据类必须具有不带参数的公共或受保护构造函数。 [1]:https://msdn.microsoft.com/en-us/library/dd468057.aspx – 2015-04-15 11:09:09

+0

哦,通常的格式化指令不会起作用。很高兴知道。 – 2015-04-15 11:32:08