【问题标题】:Creating entity objects for insertion in Entity Framework 6在 Entity Framework 6 中创建用于插入的实体对象
【发布时间】:2014-05-12 17:05:27
【问题描述】:

通过过去的例子,我学会了使用DbSet<TEntity>.Create()创建实体对象进行插入。但是,我发现只使用带有对象初始化器的默认构造函数似乎也可以。

我的主要问题是,我们还需要使用DbSet<TEntity>.Create(),为什么?

额外问题:如果有的话,这两个代码示例之间的功能差异是什么?

“书本”:

    Dim db As New EFDAL.WidgetDbEntities()
    Dim dbWidgetBatch2 As EFDAL.WidgetBatch = db.WidgetBatches.Create()
    dbWidgetBatch2.CreationTimestamp = Now
    dbWidgetBatch2.CreatedByUsername = userName
    db.WidgetBatches.Add(dbWidgetBatch2)
    db.SaveChanges()

“同样有效吗?”:

    Dim db As New EFDAL.WidgetDbEntities()
    Dim dbWidgetBatch As New EFDAL.WidgetBatch With {
        .CreationTimestamp = Now,
        .CreatedByUsername = userName
    }
    db.WidgetBatches.Add(dbWidgetBatch)
    db.SaveChanges()

【问题讨论】:

标签: vb.net entity-framework


【解决方案1】:

在查看了重复的候选人之后,我发现这个问题的主要主题已经涵盖了。但是,我觉得总结这些概念如何应用于我的问题是值得的。

如果我理解正确,简短的回答是DbSet.Create() 创建了一个“代理”对象,除其他外,它可以延迟加载导航属性。

在我发布的示例中,没有使用导航属性,因此两个示例实际上工作相同,对于大多数插入,我怀疑大多数人不需要代理对象。

链接:

【讨论】:

  • 在将model 添加到数据库上下文之后,使用DbSet.Create() 的替代方法是使用Entry(model).Reference(o => MyRef).Load()。例如:如果model.MyRefId 有一个值,那么model.MyRef 的对应实体将被加载。我发现这在使用 ASP.NET MVC 应用程序和开箱即用的模型绑定器时很有用。
猜你喜欢
  • 2015-11-03
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 2013-12-25
  • 2015-11-09
相关资源
最近更新 更多