簡體   English   中英

添加自有對象的集合

[英]Adding collection of owned objects

我有一個擁有自有類型集合的域模型。 當我嘗試在owntyped集合中添加多個對象時? 我得到一個例外:

System.InvalidOperationException :'無法跟蹤實體類型'ChildItem'的實例,因為已經跟蹤了另一個鍵值為'{NameId:-2147482647,Id:0}'的實例。 替換擁有的實體時,在不更改實例的情況下修改屬性,或首先分離先前擁有的實體條目。

怎么解決?

更新

我的域名類:

public class Parent
    {
        public int Id { get; set; }
        public Child Name { get; set; }
        public Child ShortName { get; set; }
    }

    public class Child
    {
        public List<ChildItem> Items { get; set; }
    }

    public class ChildItem
    {
        public string Text { get; set; }
        public string Language { get; set; }
    }

我的DbContext:

public class ApplicationContext : DbContext
    {
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Parent>()
                .OwnsOne(c => c.Name, d =>
                {
                    d.OwnsMany(c => c.Items, a =>
                    {
                        a.HasForeignKey("NameId");
                        a.Property<int>("Id");
                        a.HasKey("NameId", "Id");
                        a.ToTable("ParentNameItems");
                    })
                    .ToTable("ParentName");
                })
                .ToTable("Parent");

                modelBuilder.Entity<Parent>()
                .OwnsOne(c => c.ShortName, d =>
                {
                    d.OwnsMany(c => c.Items, a =>
                    {
                        a.HasForeignKey("NameId");
                        a.Property<int>("Id");
                        a.HasKey("NameId", "Id");
                        a.ToTable("ParentShortNameItems");
                    })
                    .ToTable("ParentShortName");
                })
                .ToTable("Parent");
        }
    }

用法:

static void Main(string[] args)
        {
            var context = new ApplicationContext();

            var parent = new Parent()
            {
                Name = new Child()
                {
                    Items = new List<ChildItem>()
                    {
                        new ChildItem() { Text = "First value", Language = "en-en"},
                        new ChildItem() { Text = "Second value", Language = "en-en"}
                    }
                },
                ShortName = new Child()
                {
                    Items = new List<ChildItem>()
                    {
                        new ChildItem() { Text = "First short value", Language = "en-en"},
                        new ChildItem() { Text = "Second short value", Language = "en-en"}
                    }
                }
            };

            context.Set<Parent>().Add(parent);

            context.SaveChanges();
        }

好吧,首先你的課程沒有意義。 如果它應該是什么

public class Parent
{
    public int Id { get; set; }
    public List<Child> Children { get; set; }
}

父母應該有很多孩子(或者可能沒有孩子,可能是空名單?)。 孩子的名字和身份證怎么樣,他不是每個人都有一個? 也許是一個像父母一樣的東西

public class Child
{
    public virtual List<ChildItem> Items { get; set; } //why virtual? you planning to inherit?
    public string Name {get; set; }
    public int Id {get; set; }
    public int ParentId {get; set; }
}

我覺得這看起來好一點。 數據庫應該有匹配的表。 而且說實話EF(實體框架) 自動創建將為您完成99%的工作,所以請使用它。

問題解決了。 它符合要求

a.HasKey("NameId", "Id");

OnModelCreating方法中。 我使用了一個示例 ,其中寫了abount配置自有類型的集合。

從密鑰定義中刪除“NameId”字段后

a.HasKey("Id");

現在一切正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM