在Entity Framework </object> </object>中创建<object> vs new <object>

时间:2011-11-20 21:34:05

标签: .net vb.net entity-framework

我有一个实体对象的初始化程序/更新程序。使用

是否有任何危险
Dim myObject As SpecialThing = New SpecialThing()

然后设置所有值(使用已写入的更新程序),或者我是否需要使用:

Dim myObject As SpecialThing = SpecialThing.Create()

有30个参数,updater已设置值/处理错误。只是想重用那段代码。

2 个答案:

答案 0 :(得分:35)

我不知道你对myDB.CreateSpecialThing(.....)究竟是什么意思。我有三种解释:

  • objectContext.CreateObject<SpecialThing>()

  • dbContext.SpecialThings.Create()(EF&gt; = 4.1)

  • SpecialThing.Create(.....)EntityObject派生实体的静态方法)

第三种方法只是一个自动生成的帮助器,它接受参数(对于必需的字段),设置属性并返回对象。这与使用new创建对象并在之后设置属性完全相同。

如果您正在使用POCO并使用延迟加载或更改跟踪代理,前两种方法将发挥作用。这些方法将创建实体的动态代理(它是从您的实体类派生的动态类),而不是直接创建实体。这些方法都不会将实体附加到上下文中,您必须手动执行此操作 - 无论您是使用这些方法创建实体还是使用new创建实体。

假设使用CreateObject<T> Create集合的User实体,使用virtual / Roles可能很重要的示例:

using (var ctx = new MyDbContext())
{
    var user = ctx.Users.Create();
    user.Id = 1;
    ctx.Users.Attach(user);

    var roles = user.Roles;
}

使用virtualRoles集合启用延迟加载,上面的代码将加载用户1的所有角色(如果用户没有角色,则加载空集合)。另一方面使用new ......

using (var ctx = new MyDbContext())
{
    var user = new User { Id = 1 };
    ctx.Users.Attach(user);

    var roles = user.Roles;
}

...不允许懒惰加载集合,因为user不是动态代理对象。无论用户是否有角色,roles都是null

所以,我要说创建一个new的实体没有危险。您只需要记住,您没有使用new创建的实体的延迟加载或更改跟踪代理的功能。

答案 1 :(得分:3)

如果您自己创建对象,则不会将其附加到上下文。您需要attach the object才能在数据库中更新更新。

尽管如果使用Create Method创建实体,它将不会附加到上下文,这将通过SaveChanges方法保存在DB中。 http://msdn.microsoft.com/en-us/library/gg696136(v=vs.113).aspx

相关问题