C# 向数据库中添加多条相同记录

C# 向数据库中添加多条相同记录,c#,asp.net-mvc,C#,Asp.net Mvc,我试图多次向数据库添加同一对象(只是更改属性),但问题是在将第一条记录添加到数据库后,该记录将获得一个id,而其他记录无法添加 我的模型: class MyClass{ int id {set;get;} string name {set;get;} string color {set;get;} //and other properities. } 我的控制器: public ActionResult Test(MyClass obj,int Counter

我试图多次向数据库添加同一对象(只是更改属性),但问题是在将第一条记录添加到数据库后,该记录将获得一个id,而其他记录无法添加

我的模型:

class MyClass{ 
    int id {set;get;}
    string name {set;get;}
    string color {set;get;}
    //and other properities.
}
我的控制器:

public ActionResult Test(MyClass obj,int Counter){
    for(int i=0;i<Counter;i++){
        MyClass NewObject=obj;
        NewObject.name=obj.name+" "+i.ToString();
        Db.MyClass.Add(NewObject);
        Db.SaveChanges();
    }
 }
公共操作结果测试(MyClass obj,int计数器){

对于(int i=0;i您不应该使用同一个对象来表示数据库中的多个对象。在后台,EF保留对它知道的数据对象的引用,这些引用是重要的

如果要添加大量类似的对象,有多个选项可供选择。其中两个选项是:

使用方法初始化新对象

可以使用公共方法初始化对象的多个实例,只添加不同的属性值(如果使用C#7,则方法也可以是本地函数):


您应该使用哪个选项完全取决于您的特定用例。

将一个复杂对象分配给另一个复杂对象会导致对源对象的指针或引用,因此,所做的任何修改都会反映到由两个变量引用的一个实例。您可以在.net中通过检查objec的哈希代码看到这一点t、 要进行深度克隆或复制,您需要使用
new MyObject()
在内存中构造一个新对象,然后复制简单类型值。您需要实例化并复制所有本身是复杂对象的子属性

public ActionResult Test(MyClass obj,int Counter){
    for(int i=0;i<Counter;i++){
        MyClass NewObject=new MyClass();
        NewObject.name=obj.name+" "+i.ToString();
        NewObject.color = obj.color;
        Db.MyClass.Add(NewObject);
        Db.SaveChanges();
    }
 }
公共操作结果测试(MyClass obj,int计数器){

对于(int i=0;i一种方法是在每次循环迭代中使用以下内容构造一个新对象(我更改了变量名称以匹配更常见的实践):

公共操作结果测试(MyClass baseObj,int计数器){

对于(int i=0;i您一直在引用同一个对象,因此entity framework首先执行插入操作,然后更新记录
计数器
-1次。您应该真正遵守.NET命名约定。如果您使用小写字母命名类,使用Pascal大小写命名局部变量,那么对于大多数C#开发者来说,您的代码将更难阅读。Besides,你也应该用你正在使用的或映射器来标记你的问题。@Jerodev,是的,这就是正在发生的事情。但是,向数据库多次添加对象的正确方法是什么呢。
class MyClass{ 
    public int Id { set; get; }
    public string Name { set; get; }
    public string Color { set; get; }
    public MyClass Clone() {
        MyClass clone = (MyClass)MemberwiseClone();
        clone.Id = 0;
        return clone;
    }
}

public ActionResult Test(MyClass obj, int Counter){
    for(int i = 0; i < Counter; i++){
        MyClass newObject = obj.Clone();
        newObject.Name = obj.Name + " " + i.ToString();
        Db.MyClass.Add(newObject);
        Db.SaveChanges();
    }
}
public ActionResult Test(MyClass obj,int Counter){
    for(int i=0;i<Counter;i++){
        MyClass NewObject=new MyClass();
        NewObject.name=obj.name+" "+i.ToString();
        NewObject.color = obj.color;
        Db.MyClass.Add(NewObject);
        Db.SaveChanges();
    }
 }
public ActionResult Test(MyClass baseObj,int Counter){
    for(int i=0;i<Counter;i++) {

        MyClass newObject = new MyClass()
        {
            Name = baseObj.Name,
            Color = baseObj.Color
        };

        Db.MyClass.Add(NewObject);
        Db.SaveChanges();
    }
 }