[英]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.