C# EF 6和x27;散装';使用FK中继模型插入

C# EF 6和x27;散装';使用FK中继模型插入,c#,entity-framework-6,clone,bulkinsert,C#,Entity Framework 6,Clone,Bulkinsert,我试图在两个具有FK关系(一对多)的表上使用EF(模型优先)进行大容量插入。下面的代码正确插入了所有质询条目,但只插入了一次X金额。我的期望。。。我有10个短缺和2个挑战。我将收到2个挑战条目和20个短缺条目。我只看到10个挑战项目的第一次短缺插入。(以下代码已简化) //用于克隆短缺集合的类 公共类ShortageCollection:集合 { 公共ShortageCollection(IList源代码):基本(源代码){} 公共ShortageCollection(){} 公共Shortag

我试图在两个具有FK关系(一对多)的表上使用EF(模型优先)进行大容量插入。下面的代码正确插入了所有质询条目,但只插入了一次X金额。我的期望。。。我有10个短缺和2个挑战。我将收到2个挑战条目和20个短缺条目。我只看到10个挑战项目的第一次短缺插入。(以下代码已简化)

//用于克隆短缺集合的类
公共类ShortageCollection:集合
{
公共ShortageCollection(IList源代码):基本(源代码){}
公共ShortageCollection(){}
公共ShortageCollection克隆()
{
返回克隆(此);
}
公共静态ShortageCollection克隆(ShortageCollection短缺)
{
var res=新的ShortageCollection();
foreach(var s短缺)
{
res.Add(s.Clone());
}
}
}
公共类短缺:StandardDB.短缺
{
公共资源短缺()
{
返回新的短缺()
{
零件号=此。零件号,
注=此。注,
数量=此数量,
ResponseMachine=this.ResponseMachine
};
}
}
公开挑战()
{
var JSONJobs=new JavaScriptSerializer()。反序列化(作业);
var JSONParts=new JavaScriptSerializer()。反序列化(部件);
使用(ARTEntities艺术=新ARTEntities())
{
art.Configuration.AutoDetectChangesEnabled=false;
art.Configuration.ValidateOnSaveEnabled=false;
ShortageCollection sColl=新ShortageCollection();
foreach(JSONParts中的var部分)
{
短缺s=新的短缺()
{
零件号=零件号Invid,
注=挑战,
数量=零件数量,
ResponseMachine=ResponseMachine
};
sColl.Add(s);
}
foreach(JSONJobs中的var作业){
挑战c=新挑战()
{
InitiatorORG=Org,
TypeID=TypeID,
离散作业=作业,
InitiatorPERSON_ID=InitiatorPersonID,
InitiatedDate=datenow,
挑战者1=挑战,
ChampionGroupID=ChampionGroupID,
StatusID=StatusID,
InitiatorGroupID=InitiatorGroupID,
分区ID=分区ID,
短缺=sColl.Clone()
};
第2条.挑战.添加(c);
}
艺术保存变化();
}
}

您只造成了10个内存不足。您的
Clone
方法是浅层克隆,不会遍历和克隆每个对象。因此,您有两个列表,其中包含10个相同的项(每对项指向完全相同的内存引用)

您需要做的是DeepClone,它类似于以下内容:

    public static ShortageCollection Clone(ShortageCollection shortage)
    {
        var res = new ShortageCollection();
        foreach(var s in shortage) {
            res.Add( s.Clone() );
        }

        return res;
    }
在你的课堂上:

public class Shortage
{
    public Shortage Clone()
    {
        return new Shortage()
        {
            SomeProp = this.SomeProp,
            SomeOtherProp = this.SomeOtherProp
        }
    }
}
请注意,如果这些对象中的任何一个指向另一个实体,则每对对象都将指向同一个实体


搜索DeepClone以获取更多信息

您只在内存中创建了10个短缺。您的
Clone
方法是浅层克隆,不会遍历和克隆每个对象。因此,您有两个列表,其中包含10个相同的项(每对项指向完全相同的内存引用)

您需要做的是DeepClone,它类似于以下内容:

    public static ShortageCollection Clone(ShortageCollection shortage)
    {
        var res = new ShortageCollection();
        foreach(var s in shortage) {
            res.Add( s.Clone() );
        }

        return res;
    }
在你的课堂上:

public class Shortage
{
    public Shortage Clone()
    {
        return new Shortage()
        {
            SomeProp = this.SomeProp,
            SomeOtherProp = this.SomeOtherProp
        }
    }
}
请注意,如果这些对象中的任何一个指向另一个实体,则每对对象都将指向同一个实体


搜索DeepClone以获取更多信息

感谢您为我指明了正确的方向。上面的代码会产生此错误。(局部变量)短缺s.'s'是一个变量,但与类型一样使用。谢谢。如果我没有重写第一个类的模型,它似乎可以工作。我得到一个“CLR类型到EDM类型的映射不明确,因为多个CLR类型与EDM类型“短缺”匹配。以前找到的CLR类型为“StandardDB.短缺”,新找到的CLR类型为“WebApps.Controllers.ChallengeController+shorth”。此外,我还必须使用res.Add(s.Clone()),而不是r=s.Clone(),因为这是一个短缺的集合。有趣的是,你的其他类型是什么?你能提出这两种类型的名称空间吗?所以我可以在当地测试一下谢谢你给我指出了正确的方向。上面的代码会产生此错误。(局部变量)短缺s.'s'是一个变量,但与类型一样使用。谢谢。如果我没有重写第一个类的模型,它似乎可以工作。我得到一个“CLR类型到EDM类型的映射不明确,因为多个CLR类型与EDM类型“短缺”匹配。以前找到的CLR类型为“StandardDB.短缺”,新找到的CLR类型为“WebApps.Controllers.ChallengeController+shorth”。此外,我还必须使用res.Add(s.Clone()),而不是r=s.Clone(),因为这是一个短缺的集合。有趣的是,你的其他类型是什么?你能提出这两种类型的名称空间吗?所以我可以在本地进行测试