2013-05-14 55 views
0

以下是我通常會從數據庫中檢索對象:實體框架:填充現有的對象實例

Dim Prod = (From P In Db.Products Where P.ProductID = 123).FirstOrDefault() 

現在,我需要實現「負載」的實例方法,其可稱爲像這樣:

Dim Prod = New Product() 
Prod.Load(123) 

我該如何去填充數據庫中現有的Product對象?我試圖避免使用反射或任何雜亂的複製方法。

我試圖做這樣的事情:

Public Overridable Sub Load(ByVal ProductID As Integer) 
    Db.Products.Where(Function(P) P.ProductID = ProductID).Populate(Me) 
End Sub 
+0

你可以提供一些關於你爲什麼需要這樣實現它的更多信息嗎?大多數人通常建議您保持實體與數據訪問層的細節絕緣。檢索頂部列出的對象的正常方式有什麼問題? – 2013-05-14 18:29:11

+0

我正在更新從ADO.NET到實體框架的現有框架 - 所以加載功能需要在那裏與現有的代碼兼容。 – 2013-05-14 18:57:20

回答

1

最接近你就可以得到的是你的實體對象,然後通過使用DbEntityEntry.ReferenceDbEntityEntry.Collection方法來獲取實例上使用DbEntityEntry.ReloadDbReferenceEntryDbCollectionEntry爲您的實體上的每個導航屬性和集合,您可以用它來重新加載這些成員。這樣的事情:

Public Overridable Sub Load(ByVal ProductID As Integer) 

    ' Set primary key 
    Me.ProductID = ProductID 

    ' Reload scalar/complex properties 
    Db.Entry(Me).Reload() 

    ' Reload navigation properties 
    Db.Entry(Me).Reference(Function(p) p.Entity).Load() 
    Db.Entry(Me).Reference(Function(p) p.OtherEntity).Load() 

    ' Reload navigation collections 
    Db.Entry(Me).Collection(Function(p) p.ChildEntities).Load() 
    Db.Entry(Me).Collection(Function(p) p.OtherChildEntities).Load() 

End Sub 
+0

這是哪個EF? – 2013-05-14 18:29:17

+0

這在Entity Framework 5.0上可用。 – 2013-05-14 18:38:34

+0

謝謝!這工作,我只需要使用Db.Products.Attach(Me)首先附加對象。 – 2013-05-14 18:56:25