2016-05-12 90 views
1

我是MVC實體框架中的新成員。使用實體框架複製MVC中的重複記錄

我有一個名爲Product的表。它包含40個字段。

我有一個任務複製的產品或創造新的產品編號相同的表中的重複記錄..

我怎樣才能做到這一點的有效途徑?

我嘗試使用下面的代碼

Public ActionResult CopyProduct(long ProductID) 
{ 
var oldProductScript = db.Products.FirstOrDefault(x=>x.ProductID == ProductID) 


Product p = new Product(); 
p.name = oldProductScript.name; 
p.price =oldProductScript.price; 
p.model =oldProductScript.model; 
p.image = oldProductScript.image; 
p.status =oldProductScript.status; 
. 
. 
. 
. 
. 
like so till 40th field 

db.Products.AddObject(p); 
db.SaveChanges(); 

}

這是正確的方式來完成這個任務?

請建議。

感謝

+0

這可能是更好的做任務,我認爲數據庫的存儲過程... – Ian

+1

我認爲這個問題是有關複製所需要的C#代碼產品。我建議你使用一個像AutoMapper這樣的外部庫,它可以根據需要完成產品的完美副本和定製行爲。希望這可以幫助:http://automapper.org/ –

+0

看看這裏:http://stackoverflow.com/questions/78536/deep-cloning-objects。這會對你有用嗎? – LocEngineer

回答

0

如果你想這樣做更容易(減少編碼),我會建議你使用代碼優先方法。 使用此link知道它是什麼和代碼示例。

將模型(DBContext)表添加爲使用代碼優先方法後,您將能夠以比通常方法更快速地獲取和設置表的屬性。

public class InheritanceMappingContext : DbContext 
{ 
    public DbSet<TableName> TableProperty { get; set; } 
} 

使用多態查詢檢索表的字段。

IQueryable<TableName> linqQuery = from b in context.TableName select b; 
List<TableName> tableFields = linqQuery.ToList(); 

linqQuery返回類型的對象列表

+0

我的項目已經在數據庫優先方法中。對於實體對象的附加和分離怎麼樣? –

+2

@ajaysingh這可能不是一種有效的方法。傳遞給Attach方法的對象必須具有有效的EntityKey值。如果對象沒有有效的EntityKey值,請使用AttachTo方法指定實體集的名稱。 –

+0

@ajaysingh - 如果你想使用數據庫優先的方法,你可以克隆對象,而是序列化和傳輸爲JSON。這將是一個解決性能問題的重要途徑。 –

0

嘗試是這樣的:

 Products productToCopy = db.Products.FirstOrDefault(p => p.ProductId == productID); 
     db.Entry(productToCopy).State = EntityState.Detached; 
     productToCopy.ProductId = 0; 
     db.Products.Add(productToCopy); 
     db.SaveChanges(); 
+0

什麼是DXLEntities? –

+0

這是db.Entry ??在第二行.. –

+0

是的,我假設你的代碼中的「db」是一個DBContext? https://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext.entry(v=vs.113).aspx –

0

警告:我和我的課的一個測試,這和它的工作。不知道這是否會與你的工作:

var prod = context.Products.FirstOrDefault(p => p.ProductID == ProductID); 
var prod2 = new Products(); 
foreach (PropertyInfo pi in prod.GetType().GetProperties()) 
{ 
    prod2.GetType().GetProperties().First(p=>p.Name==pi.Name).SetValue(prod2, pi.GetValue(prod, null), null); 
} 

//prod2 is now a clone of prod. Make sure to adjust your product ID before adding the new product.