EF 6 'Bulk'插入FK关系模型

本文关键字:关系 模型 FK 插入 EF Bulk | 更新日期: 2023-09-27 18:02:07

我试图在两个具有FK关系(一对多)的表上使用EF(模型优先)进行批量插入。下面的代码正确地插入了所有的Challenge条目,但只插入了X数量的shortage一次。我的期望…我有10个短缺和2个挑战。我应该收到2个挑战条目和20个短缺条目。我只看到了第一次短缺的10个挑战条目。(以下代码经过简化)

//class for cloning Shortage collection
public class ShortageCollection : Collection<Shortage>
    {
        public ShortageCollection(IList<Shortage> source) : base(source) { }
        public ShortageCollection() { }
        public ShortageCollection Clone()
        {
            return Clone(this);
        }
        public static ShortageCollection Clone(ShortageCollection shortage)
        {
            var res = new ShortageCollection();
            foreach (var s in shortage)
            {
                res.Add(s.Clone());
            }
        }
    }
 public class Shortage : StandardDB.Shortage
    {
       public Shortage Clone()
        {
            return new Shortage()
            {
                PART_NUMBER = this.PART_NUMBER,
                Note = this.Note,
                Qty = this.Qty,
                ResponseMachine = this.ResponseMachine
            };
        }
    }
public void CreateChallenge()
    {
        var JSONJobs = new JavaScriptSerializer().Deserialize<string[]>(Jobs);
        var JSONParts = new JavaScriptSerializer().Deserialize<ChallengePartsList[]>(Parts);
        using (ARTEntities art = new ARTEntities())
        {
            art.Configuration.AutoDetectChangesEnabled = false;
            art.Configuration.ValidateOnSaveEnabled = false;
            ShortageCollection sColl = new ShortageCollection();
            foreach(var part in JSONParts)
            {
                Shortage s = new Shortage()
                {
                    PART_NUMBER = part.Invid,
                    Note = Challenge,
                    Qty = part.Qty,
                    ResponseMachine = ResponseMachine
                };
                sColl.Add(s);
            }
            foreach (var job in JSONJobs) {
                Challenge c = new Challenge()
                {
                    InitiatorORG = Org,
                    TypeID = TypeID,
                    DISCRETE_JOB = job,
                    InitiatorPERSON_ID = InitiatorPersonID,
                    InitiatedDate = datenow,
                    Challenge1 = Challenge,
                    ChampionGroupID = ChampionGroupID,
                    StatusID = StatusID,
                    InitiatorGroupID = InitiatorGroupID,
                    DivisionID = DivisionID,
                    Shortages = sColl.Clone()
                };
                art.Challenges.Add(c);
            }
            art.SaveChanges();
        }
    }

EF 6 'Bulk'插入FK关系模型

您只在内存中创建了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获取更多信息