2013-01-07 77 views
2

我需要如何基於實體框架中的舊實體創建新實體?

  1. 負載一些實體到內存中,
  2. 變化的接其「標」
  3. 屬性值的-without觸摸它的導航屬性。和
  4. 將它們作爲新實體保存到Db中。

    如何在EntityFramework中實現這一點,是否足以將對象的ID設置爲NULL以將其保存爲新的實體或應該是什麼訣竅?

+0

這是與數據庫生成的主鍵? –

回答

0

根據你如何使用實體框架,我相信你可以分離和附加你的實體,改變標量值(包括ID)並將其標記爲「已添加」。您可能仍然需要連接/添加外國實體。看到這個頁面多一點信息是什麼我談論:

http://msdn.microsoft.com/en-us/data/jj592676.aspx

0

我曾在一個項目中,實體必須是唯一的和變化的實體將產生一個新的實體,這同樣的困難。我在實體類中創建了一個Clone方法,它接受實體並返回相同的類型。它創建一個新實例,複製所有相關屬性,然後返回新實體。

爲了更進一步,您可能會創建一個具有Clone方法的基類,該方法使用反射來複制屬性值並讓您的實體繼承它。

1

您只需將entity state從修改更改爲已添加,實體框架將執行插入而不是更新。

例使用的DbContext API:

DbContext context = // ... 
foreach (var entityEntry in context.ChangeTracker.Entries()) 
{ 
    if (entityEntry.State == EntityState.Modified) 
     entityEntry.State = EntityState.Added; 
} 
ct.SaveChanges(); 
+0

當狀態改變時,實體實體的EntityKey會發生什麼?保持原樣並在SaveChanges()上被忽略並表現爲尚未設置? – pencilCake

0

你可以克隆與Automapper對象,修改幾個屬性和它保存爲一個新的實體。

例如:

//Get the source object from a fictitious repository 
Person source = PersonRepository.GetPersonByID(555); 

//Create an AutoMapper Mapper 
Mapper.CreateMap<Person, Person>(); 
//If you want to ignore the primary key of the original object, use something like this: 
//Mapper.CreateMap<Person, Person>().ForMember(x => x.PersonID, y => y.Ignore()); 

//Clone your source person 
var clone = Mapper.Map<Person>(source); 

//Set some property 
clone.SomeProperty = 123; 

//Save our clone against the fictional repository 
PersonRepository.Save(clone); 

//You could also return your clone at this point... 

我用這種方法前些天克隆記錄。你可以做的一件事就是確定來源,例如source.PersonID,並將其與clone.ParentID對應,以便您可以找到克隆的起源(如果需要,您可以繼續並選擇外鍵)。

源/推薦閱讀 - Copy object to object (with Automapper ?)

如果需要,您還可以映射到一個新的實體類型 - 看到Automapper維基 - https://github.com/AutoMapper/AutoMapper/wiki/Getting-started

+0

然後,Jimmy Bogard(Automapper的作者)說,它不適合克隆! http://stackoverflow.com/q/5713556/201648 –