Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用实体框架复制MVC中的重复记录_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# 使用实体框架复制MVC中的重复记录

C# 使用实体框架复制MVC中的重复记录,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我是MVC实体框架的新手 我有一张桌子叫Product。它包含40个字段 我有一项任务要复制产品或在同一个表中创建具有新产品ID的重复记录 我怎样才能有效地做到这一点 我试着使用下面的代码 Public ActionResult CopyProduct(long ProductID) { var oldProductScript = db.Products.FirstOrDefault(x=>x.ProductID == ProductID) Product p = new Produ

我是MVC实体框架的新手

我有一张桌子叫Product。它包含40个字段

我有一项任务要复制产品或在同一个表中创建具有新产品ID的重复记录

我怎样才能有效地做到这一点

我试着使用下面的代码

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();
}

这是完成这项任务的正确方法吗

请建议


谢谢

如果您希望更轻松地完成这项工作(减少编码),我建议您使用代码优先的方法。 使用此代码了解它是什么,并编写示例代码

在使用代码优先的方法添加带有模型的表(DBContext)之后,您将能够轻松地获取和设置表的属性,甚至比通常的方法更快

public class InheritanceMappingContext : DbContext
{
    public DbSet<TableName> TableProperty { get; set; }
}
公共类继承MappingContext:DbContext
{
公共DbSet TableProperty{get;set;}
}
使用多态查询检索表的字段

IQueryable<TableName> linqQuery = from b in context.TableName select b;
List<TableName> tableFields = linqQuery.ToList(); 
IQueryable linqQuery=来自context.TableName中的b选择b;
List tableFields=linqQuery.ToList();

linqQuery返回类型为

的对象列表。如果您希望更轻松地执行此操作(减少编码),我建议您使用代码优先的方法。 使用此代码了解它是什么,并编写示例代码

在使用代码优先的方法添加带有模型的表(DBContext)之后,您将能够轻松地获取和设置表的属性,甚至比通常的方法更快

public class InheritanceMappingContext : DbContext
{
    public DbSet<TableName> TableProperty { get; set; }
}
公共类继承MappingContext:DbContext
{
公共DbSet TableProperty{get;set;}
}
使用多态查询检索表的字段

IQueryable<TableName> linqQuery = from b in context.TableName select b;
List<TableName> tableFields = linqQuery.ToList(); 
IQueryable linqQuery=来自context.TableName中的b选择b;
List tableFields=linqQuery.ToList();

linqQuery返回类型为的对象列表

尝试以下操作:

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

试着这样做:

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

警告:我已经用我的一个类测试了这个,它成功了。不确定它是否适用于您的:

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.

警告:我已经用我的一个类测试了这个,它成功了。不确定它是否适用于您的:

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.


我认为最好在数据库的存储过程中完成这项任务……我认为问题与复制产品所需的C#代码有关。我建议您使用像AutoMapper这样的外部库,它可以完美地复制产品,如果需要,还可以定制产品的行为。希望这能有所帮助:看看这里:。这对你有帮助吗?我想最好在数据库的存储过程中完成这项任务……我认为问题与复制产品所需的C#代码有关。我建议您使用像AutoMapper这样的外部库,它可以完美地复制产品,如果需要,还可以定制产品的行为。希望这能有所帮助:看看这里:。这对你有用吗?我的项目已经在数据库优先的方法中。。实体对象的附加和分离如何?@ajaysingh这可能不是一种有效的方法。传递给Attach方法的对象必须具有有效的EntityKey值。如果对象没有有效的EntityKey值,请使用AttachTo方法指定实体集的名称。@ajaysingh-如果要使用数据库优先方法,可以克隆对象,或者序列化并作为JSON传输。这将是解决性能问题的一个重要方法。我的项目已经采用数据库优先的方法。。实体对象的附加和分离如何?@ajaysingh这可能不是一种有效的方法。传递给Attach方法的对象必须具有有效的EntityKey值。如果对象没有有效的EntityKey值,请使用AttachTo方法指定实体集的名称。@ajaysingh-如果要使用数据库优先方法,可以克隆对象,或者序列化并作为JSON传输。这将是解决性能问题的一个相当重要的方法。什么是DXLEntities?是的,我假设代码中的“db”是DBContext?但是Intellisense不支持db.Entry。它显示的是db.GetEntry,而不是你建议我的。你使用的是什么EF版本?我的EF版本6.0.0.0什么是DXLEntities?是的,我假设代码中的“db”是DBContext?但是Intellisense不支持db.Entry.it显示db.GetEntry而不是你建议我的。你使用的是什么EF版本?我的EF版本6.0.0.0