Dot-Net

在實體框架中創建<Object> vs new <Object>

  • January 20, 2015

我有一個實體對象的初始化程序/更新程序。使用有沒有危險

Dim myObject As SpecialThing = New SpecialThing()

然後設置所有值(使用已經編寫的更新程序),還是我需要使用:

Dim myObject As SpecialThing = SpecialThing.Create()

有 30 個參數,更新程序已經設置了值/處理錯誤。只是想重用該程式碼。

如果您自己創建對象,它不會附加到上下文中。您需要附加對象才能在數據庫中更新更改。

即使您使用 Create 方法創建實體,它也不會附加到上下文,這將通過 SaveChanges 方法保存在數據庫中。 http://msdn.microsoft.com/en-us/library/gg696136(v=vs.113).aspx

我不知道你到底是什麼意思myDB.CreateSpecialThing(.....)。我有三種解釋:

  • objectContext.CreateObject&lt;SpecialThing&gt;()
  • dbContext.SpecialThings.Create()(EF >= 4.1)
  • SpecialThing.Create(.....)EntityObject派生實體的靜態方法)

第三種方法只是一個自動生成的助手,它接受參數(對於必填欄位)、設置屬性並返回對象。new這與創建對象並隨後設置屬性完全相同。

如果您正在使用 POCO 並使用延遲載入或更改跟踪代理,則前兩種方法會發揮作用。這些方法將創建實體的動態代理(這是從您的實體類派生的動態類),而不是直接創建實體。這些方法都沒有將實體附加到上下文,您必須手動執行此操作 - 無論您是使用這些方法創建實體還是使用new.

使用CreateObject&lt;T&gt;/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啟用延遲載入,上面的程式碼將載入使用者 1 的所有角色(如果使用者沒有角色,則載入一個空集合)。另一方面Roles使用…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.

引用自:https://stackoverflow.com/questions/8204921