3

エンティティフレームワークの使用とエンティティ間の関係の設定について質問があります。私が達成したいのは、別のエンティティからの重複アイテムをコレクションに含めることです。

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
4

1 に答える 1

1

ここでは、ドロップダウンメニューではなく、Pizza&Co。について話しますね。

私の理解では、あなたは、aが持つことができる可能性のあるエクストラと、ゲストが注文されたものと一緒に持ちたい実際の注文されたエクストラ区別MenuItemする必要がありますMenuItem

MenuItemクラスは変更せずに滞在することができ、レストランが特定の場合に提供するすべての可能エクストラについて説明しMenuItemます。

public class MenuItem // Pizza Margherita
{
    // ...
    public virtual ICollection<MenuItemExtras> MenuItemExtras { get; set; }
    // Possible Extras: Paprika or Ham or Mushrooms
}

ただし、順序付けられたExtras(可能なExtrasのサブセットであると予想されます)をモデル化するには、新しいクラスを導入する必要がありますOrderMenuItem。には、この新しいタイプOrderのコレクションがあります(直接ではありません)。ItemsOrderMenuItemMenuItem

public class Order
{
    public Guid OrderId { get; set; }
    public virtual ICollection<OrderMenuItem> Items { get; set; }
}

には、ゲストが注文したゲストへのOrderMenuItem参照がありMenuItem、ゲストのコレクションはMenuItemExtrasすべての可能なエクストラから選択されています。

public class OrderMenuItem
{
    public int OrderMenuItemId { get; set; }

    public int OrderId { get; set; }
    public Order Order { get; set; }

    public int MenuItemId { get; set; }
    public MenuItem MenuItem { get; set; } // Pizza Margherita

    public ICollection<MenuItemExtras> MenuItemExtras { get; set; }
    // Ordered Extras: Paprika and Mushrooms (subset of Possible Extras)
}

新しい関係は次のように定義できます。

modelBuilder.Entity<OrderMenuItem>()
    .HasRequired(o => o.Order)
    .WithMany(o => o.Items)
    .HasForeignKey(o => o.OrderId);

modelBuilder.Entity<OrderMenuItem>()
    .HasRequired(o => o.MenuItem)
    .WithMany() // a MenuItem can be ordered in many orders
    .HasForeignKey(o => o.MenuItemId);

modelBuilder.Entity<OrderMenuItem>()
    .HasMany(o => o.MenuItemExtras)
    .WithMany() // an Extra can be ordered in many orders
    .Map(m => {
        m.ToTable("OrderMenuItemMenuItemExtras");
        m.MapLeftKey("OrderMenuItemId");
        m.MapRightKey("MenuItemExtraId");
    });

OrderMenuItemテーブルには、独自の主キーとOrderMenuItemId2つの外部キーがあります。1つはへのキー、もう1つはへOrderのキーMenuItemです。順序付けられたExtrasとの関係は、という名前の結合テーブルとの新しい多対多の関係OrderMenuItemMenuItemExtrasです。

于 2013-03-24T13:54:45.513 に答える