エンティティフレームワークの使用とエンティティ間の関係の設定について質問があります。私が達成したいのは、別のエンティティからの重複アイテムをコレクションに含めることです。
List<MenuItem> menuItems = new List<MenuItem>();
MenuItem m1 = menuRepository.GetItemByCode("001");
MenuItem m2 = menuRepository.GetItemByCode("001"); //same item but want to store it additionally as m2.MenuItemExtras will be different from m1.MenuItemExtras
menuItems.Add(m1);
menuItems.Add(m2);
Order order = new Order();
order.MenuItems = menuItems;
orderRepository.Save(order);
これは正常に機能しますが、テーブルに挿入されるレコードは1つだけです。
OrderMenuItem
OrderPK = 1, MenuItemPK = 1 //Id of menuItem with code "001"
私がおそらく望んでいるのは、次のようなものです。OrderPKとMenuItemPKの複合ではなく、独自の主キーを持つ3番目の列を含むOrderMenuItemテーブル。すなわち
OrderMenuItem
OrderMenuItemId = 1, OrderPK = 1, MenuItemPK = 1
OrderMenuItemId = 2, OrderPK = 1, MenuItemPK = 1
これを実際に達成する方法と、クラスの関係を再定義する必要があるかどうかがわかりません。ご意見ありがとうございます。
以下は、DbContextのクラスとスニペットです。
public class Order
{
public Guid OrderId { get; set; }
public virtual ICollection<MenuItem> MenuItems { get; set; }
public Order()
{
MenuItems = new Collection<MenuItem>();
}
}
public class MenuItem
{
public Guid MenuItemId { get; set; }
public string Code { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public int SortOrder { get; set; }
public virtual ICollection<MenuItemExtras> MenuItemExtras { get; set; }
}
public class MenuItemCategory
{
public Guid MenuItemCategoryId { get; set; }
public string Name { get; set; }
public string Code { get; set; }
public string HotKey { get; set; }
public int SortOrder { get; set; }
public virtual ICollection<MenuItem> MenuItems { get; set; }
}
public class MenuItemExtras
{
public Guid MenuItemExtrasId { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
OnModelCreating ovverideのDbContextには、次のものがあります。
modelBuilder.Entity<MenuItemCategory>().Property(m => m.MenuItemCategoryId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<MenuItemCategory>().HasMany(m => m.MenuItems).WithMany();
modelBuilder.Entity<MenuItem>().Property(m => m.MenuItemId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<MenuItem>().HasMany(m => m.MenuItemExtras).WithMany();
modelBuilder.Entity<MenuItemExtras>().Property(m => m.MenuItemExtrasId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<Order>().Property(o => o.OrderId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<Order>().HasMany(m => m.MenuItems).WithMany();
これにより、次のテーブルが生成されます。
MenuItem
MenuItemCategory
MenuItemCategoryMenuItem
MenuItemExtras
MenuItemMenuItemExtras
Order
OrderMenuItems