【问题标题】:Entity Framework: Populate existing object instance实体框架:填充现有对象实例
【发布时间】:2013-05-14 18:02:57
【问题描述】:

以下是我通常从数据库中检索对象的方式:

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

【问题讨论】:

  • 您能否提供更多关于为什么需要以这种方式实现它的信息?大多数人通常建议您将实体与数据访问层的细节隔离开来。检索您在顶部列出的对象的正常方式有什么问题?
  • 我正在将现有框架从 ADO.NET 更新为 Entity Framework - 因此加载函数需要与现有代码兼容。

标签: .net vb.net entity-framework


【解决方案1】:

最接近的方法是在实体对象上使用DbEntityEntry.Reload,然后使用DbEntityEntry.ReferenceDbEntityEntry.Collection 方法为每个导航属性获取DbReferenceEntryDbCollectionEntry 的实例并收集您的实体,您可以使用它来重新加载这些成员。像这样的:

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

【讨论】:

  • 谢谢!那行得通,我只需要先使用 Db.Products.Attach(Me) 附加对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多