将相同的项目添加到 EF 中的不同对象
Adding the same item to different objects in EF
我有一个 class 年份和一个 class 项目:
public class Year
{
#region Properties
public int Nr { get; set; }
public virtual ICollection<Item> Item { get; private set; }
#endregion
#region Constructors
public Year()
{
Item = new HashSet<Item>();
}
public Year(int year) : this()
{
Nr = year;
}
#endregion
}
public partial class Item
{
#region Properties
public string Name { get; set; }
#endregion
#region Constructors
public Item()
{
}
public Item(string name): this()
{
Name = name;
}
#endregion
}
class 年有 0.* 个项目。在初始化器中创建 Items 和 Years 时,只有 year4 中有 Items。我目前找不到任何解释。
protected override void Seed(MyContext context)
{
try
{
Year year1 = new Year(1);
Year year2 = new Year(2);
Year year3 = new Year(3);
Year year4 = new Year(4);
Year year5 = new Year(5);
Year year6 = new Year(6);
Item africa = new Item("Afrika");
Item antarctica = new Item("Antarctica");
Item azie = new Item("Azië");
Item europa = new Item("Europa");
Item noordAmerika = new Item("Noord-Amerika");
Item zuidAmerika = new Item("Zuid-Amerika");
Item oceanie = new Item("Oceanië");
year1.Item.Add(europa);
year2.Item.Add(europa);
year3.Item.Add(europa);
year3.Item.Add(africa);
year3.Item.Add(antarctica);
year3.Item.Add(azie);
year3.Item.Add(noordAmerika);
year3.Item.Add(zuidAmerika);
year3.Item.Add(oceanie);
year4.Item.Add(europa);
year4.Item.Add(africa);
year4.Item.Add(antarctica);
year4.Item.Add(azie);
year4.Item.Add(noordAmerika);
year4.Item.Add(zuidAmerika);
year4.Item.Add(oceanie);
context.Years.Add(year1);
context.Years.Add(year2);
context.Years.Add(year3);
context.Years.Add(year4);
context.Years.Add(year5);
context.Years.Add(year6);
context.SaveChanges();
}
这是我的年份映射器:
//Properties
HasKey(t => t.Nr);
//Table
ToTable("Year");
//Relationships
HasMany(t => t.Item)
.WithRequired()
.Map(m => m.MapKey("ItemName"))
.WillCascadeOnDelete(false);
特别奇怪的是,如果我使用上面的设置,只有 year4 有项目。如果我从初始化程序中删除 year4,则 year3 只有项目。等等..
尝试以下方法:
context.Item.AddOrUpdate(i => i.Name, new Item { Name = "Afrika" });
context.Item.AddOrUpdate(i => i.Name, new Item { Name = "Antarctica" });
context.Item.AddOrUpdate(i => i.Name, new Item { Name = "Azië" });
context.Item.AddOrUpdate(i => i.Name, new Item { Name = "Europa" });
context.Item.AddOrUpdate(i => i.Name, new Item { Name = "Noord-Amerika" });
context.Item.AddOrUpdate(i => i.Name, new Item { Name = "Zuid-Amerika" });
context.Item.AddOrUpdate(i => i.Name, new Item { Name = "Oceanië" });
context.SaveChanges();
var europa = context.Item.Find("Europa");
var africa= context.Item.Find("Afrika");
var antarctica= context.Item.Find("Antarctica");
var azie= context.Item.Find("Azië");
var noordAmerika= context.Item.Find("Noord-Amerika");
var zuidAmerika= context.Item.Find("Zuid-Amerika");
var oceanie= context.Item.Find("Oceanië");
context.Years.AddOrUpdate(y => y.Nr, new Year { Nr = 1, Item = {europa } });
context.Years.AddOrUpdate(y => y.Nr, new Year { Nr = 2, Item = {europa } });
context.Years.AddOrUpdate(y => y.Nr, new Year { Nr = 3, Item = {europa, africa, antarctica, azie, noordAmerika, zuidAmerika, oceanie } });
context.Years.AddOrUpdate(y => y.Nr, new Year { Nr = 4, Item = {europa, africa, antarctica, azie, noordAmerika, zuidAmerika, oceanie } });
context.Years.AddOrUpdate(y => y.Nr, new Year { Nr = 5 });
context.Years.AddOrUpdate(y => y.Nr, new Year { Nr = 6 });
context.SaveChanges();
见http://thedatafarm.com/data-access/take-care-with-ef-4-3-addorupdate-method/
我有一个 class 年份和一个 class 项目:
public class Year
{
#region Properties
public int Nr { get; set; }
public virtual ICollection<Item> Item { get; private set; }
#endregion
#region Constructors
public Year()
{
Item = new HashSet<Item>();
}
public Year(int year) : this()
{
Nr = year;
}
#endregion
}
public partial class Item
{
#region Properties
public string Name { get; set; }
#endregion
#region Constructors
public Item()
{
}
public Item(string name): this()
{
Name = name;
}
#endregion
}
class 年有 0.* 个项目。在初始化器中创建 Items 和 Years 时,只有 year4 中有 Items。我目前找不到任何解释。
protected override void Seed(MyContext context)
{
try
{
Year year1 = new Year(1);
Year year2 = new Year(2);
Year year3 = new Year(3);
Year year4 = new Year(4);
Year year5 = new Year(5);
Year year6 = new Year(6);
Item africa = new Item("Afrika");
Item antarctica = new Item("Antarctica");
Item azie = new Item("Azië");
Item europa = new Item("Europa");
Item noordAmerika = new Item("Noord-Amerika");
Item zuidAmerika = new Item("Zuid-Amerika");
Item oceanie = new Item("Oceanië");
year1.Item.Add(europa);
year2.Item.Add(europa);
year3.Item.Add(europa);
year3.Item.Add(africa);
year3.Item.Add(antarctica);
year3.Item.Add(azie);
year3.Item.Add(noordAmerika);
year3.Item.Add(zuidAmerika);
year3.Item.Add(oceanie);
year4.Item.Add(europa);
year4.Item.Add(africa);
year4.Item.Add(antarctica);
year4.Item.Add(azie);
year4.Item.Add(noordAmerika);
year4.Item.Add(zuidAmerika);
year4.Item.Add(oceanie);
context.Years.Add(year1);
context.Years.Add(year2);
context.Years.Add(year3);
context.Years.Add(year4);
context.Years.Add(year5);
context.Years.Add(year6);
context.SaveChanges();
}
这是我的年份映射器:
//Properties
HasKey(t => t.Nr);
//Table
ToTable("Year");
//Relationships
HasMany(t => t.Item)
.WithRequired()
.Map(m => m.MapKey("ItemName"))
.WillCascadeOnDelete(false);
特别奇怪的是,如果我使用上面的设置,只有 year4 有项目。如果我从初始化程序中删除 year4,则 year3 只有项目。等等..
尝试以下方法:
context.Item.AddOrUpdate(i => i.Name, new Item { Name = "Afrika" });
context.Item.AddOrUpdate(i => i.Name, new Item { Name = "Antarctica" });
context.Item.AddOrUpdate(i => i.Name, new Item { Name = "Azië" });
context.Item.AddOrUpdate(i => i.Name, new Item { Name = "Europa" });
context.Item.AddOrUpdate(i => i.Name, new Item { Name = "Noord-Amerika" });
context.Item.AddOrUpdate(i => i.Name, new Item { Name = "Zuid-Amerika" });
context.Item.AddOrUpdate(i => i.Name, new Item { Name = "Oceanië" });
context.SaveChanges();
var europa = context.Item.Find("Europa");
var africa= context.Item.Find("Afrika");
var antarctica= context.Item.Find("Antarctica");
var azie= context.Item.Find("Azië");
var noordAmerika= context.Item.Find("Noord-Amerika");
var zuidAmerika= context.Item.Find("Zuid-Amerika");
var oceanie= context.Item.Find("Oceanië");
context.Years.AddOrUpdate(y => y.Nr, new Year { Nr = 1, Item = {europa } });
context.Years.AddOrUpdate(y => y.Nr, new Year { Nr = 2, Item = {europa } });
context.Years.AddOrUpdate(y => y.Nr, new Year { Nr = 3, Item = {europa, africa, antarctica, azie, noordAmerika, zuidAmerika, oceanie } });
context.Years.AddOrUpdate(y => y.Nr, new Year { Nr = 4, Item = {europa, africa, antarctica, azie, noordAmerika, zuidAmerika, oceanie } });
context.Years.AddOrUpdate(y => y.Nr, new Year { Nr = 5 });
context.Years.AddOrUpdate(y => y.Nr, new Year { Nr = 6 });
context.SaveChanges();
见http://thedatafarm.com/data-access/take-care-with-ef-4-3-addorupdate-method/