3

とNorthwind データベースでの と の[Order Details][Products]のマッピングの設定について簡単な質問があります。[Orders]

[Order Details]主キーはなく、次のようになります

[Order Details]
OrderId (int)
ProductId (int)
...

OrderDetailsだから私の質問は、このように動作するようにクラスを設定するにはどうすればよいですか (そして、できますか?)

public class OrderDetails
{
    public virtual Order Order { get; set; }
    public virtual Product Product { get; set; }
    public Decimal UnitPrice { get; set; }
    public int Quantity { get; set; }
    public Decimal Discount { get; set; }
}

私のデータコンテキストは次のようになります

public class NorthwindDb : DbContext
{
    public DbSet<Product> Products { get; set; }
    public DbSet<Category> Categories { get; set; }
    public DbSet<Order> Orders { get; set; }
    public DbSet<OrderDetails> OrderDetails { get; set; }
    public DbSet<Customer> Customers { get; set; }


    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new OrderDetailsConfiguration());
    }

    public static void InitializeBecauseOfThatWeirdMetaDataThingThatIDontUnderstandYet()
    {
        Database.SetInitializer<NorthwindDb>(null);
    }

}

And My OrderDetailsConfiguration(何をしているのか分からないので空)

public class OrderDetailsConfiguration : EntityConfiguration<OrderDetails>
{
    public OrderDetailsConfiguration()
    {
        //HasKey(x => x.Order.OrderId);
        //HasKey(x => x.Product.ProductId);
    }
}

ヒントやアイデアは素晴らしいでしょう。

4

2 に答える 2

4

最初に、OrderDetailsクラス内に PK と FKを明示的に配置する必要があります。

public class OrderDetails 
{        
    public int OrderID { get; set; }
    public int ProductID { get; set; }

    public virtual Order Order { get; set; }
    public virtual Product Product { get; set; }

    public Decimal UnitPrice { get; set; }
    public int Quantity { get; set; }
    public Decimal Discount { get; set; }
}

次に、次のコードを使用して、OrderDetailsConfigurationクラス の PK を指定できます ( Northwindデータベースでは、 OrderIDProductIDの両方がOrderDetailsテーブルのPK で
あることに注意してください)。

public class OrderDetailsConfiguration : EntityConfiguration<OrderDetails> 
{
    public OrderDetailsConfiguration() 
    {
        HasKey(od => new 
        {
            od.ProductID,
            od.OrderID
        });
    }
}

また、RecreateDatabaseIfModelChanges戦略を使用して、クラス モデルを変更するたびにデータベースを強制的に再作成することもできます。

Database.SetInitializer<NorthwindDb>(
        new RecreateDatabaseIfModelChanges<NorthwindDb>());

興味深い点は、これらの変更を行うと、EF は OrderDetails クラスから FK を自動的に推測し、Code First の規則に基づいて OrderID と ProductID でOrdersテーブルとProductsテーブルへのリレーションシップを作成することです。

Code First は、主キーと同じデータ型を持つ<navigation property name><primary key property name>(つまり ProductsProductID)、<principal class name><primary key property name>(つまり ProductProductID)、または(つまり ProductID) という名前のプロパティは、リレーションシップの外部キーを表すと推測します。<primary key property name>複数の一致が見つかった場合は、上記の順序で優先されます。外部キーの検出では、大文字と小文字が区別されません。

于 2010-11-11T20:53:20.770 に答える
1

[Key] 属性でキー フィールドをマークします。複合キーの場合は [Column(Order = x)] を追加する必要があります, x = 0, 1, 2, ... 番号付けは任意の番号から開始でき ます https://msdn.microsoft.com/en-us/データ/jj591583.aspx

于 2015-06-22T15:00:27.243 に答える