2011-11-20 83 views
11

我有一個實體對象的初始化程序/更新程序。是否有使用創建<Object>與實體框架中的新<Object>

Dim myObject As SpecialThing = New SpecialThing() 

然後設置的所有值(使用已經寫入更新)任何危險,或者我需要使用:

Dim myObject As SpecialThing = SpecialThing.Create() 

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

回答

3

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

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

+4

但是'myDB.CreateSpecialThing(.....)'也是如此,至少對於我能找到的這種方法的解釋。 – Slauma

34

我不知道你的意思是myDB.CreateSpecialThing(.....)。我有三個解釋:

  • ​​

  • dbContext.SpecialThings.Create()(EF> = 4.1)

  • SpecialThing.Create(.....)EntityObject衍生實體的靜態方法)

第三種方法只是一個自動生成的幫助器,它需要參數(對於所需的字段),設置正確關係並返回對象。這與使用new創建對象並在之後設置屬性完全相同。

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

實施例,其中使用CreateObject<T>/Create可能是重要的,假設一個User實體與virtualRoles集合:

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創建的實體的跟蹤代理的功能。

+0

你是對的,我的意思是第三種解釋。感謝您的全面解答 –