我有一个实体对象的初始化程序/更新程序。使用
是否有任何危险Dim myObject As SpecialThing = New SpecialThing()
然后设置所有值(使用已写入的更新程序),或者我是否需要使用:
Dim myObject As SpecialThing = SpecialThing.Create()
有30个参数,updater已设置值/处理错误。只是想重用那段代码。
答案 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;
}
使用virtual
为Roles
集合启用延迟加载,上面的代码将加载用户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