2016-05-12 50 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.