エンティティフレームワークコードで複合キーを指定する方法最初に
-
08-10-2019 - |
質問
間でマッピングを設定することについて簡単な質問があります [Order Details]
, [Products]
と [Orders]
Northwind Datbaseで。
[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);
}
}
と私 OrderDetailsConfiguration
(私が何をしているのかわからないので空)
public class OrderDetailsConfiguration : EntityConfiguration<OrderDetails>
{
public OrderDetailsConfiguration()
{
//HasKey(x => x.Order.OrderId);
//HasKey(x => x.Product.ProductId);
}
}
ヒントやアイデアは素晴らしいことです。
解決
最初に、あなたは明示的にPKとfksを内部に入れなければなりません 注文詳細 クラス:
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; }
}
次のコードを使用すると、PKSを指定できます OrderDetailSconFiguration クラス:
(で注意してください 北風 両方のデータベース OrderId と 製品番号 PKSです 注文詳細 テーブル)。
public class OrderDetailsConfiguration : EntityConfiguration<OrderDetails>
{
public OrderDetailsConfiguration()
{
HasKey(od => new
{
od.ProductID,
od.OrderID
});
}
}
また、使用できます RecreatedatabaseifModelChanges クラスモデルを変更するたびにデータベースを再作成させる戦略:
Database.SetInitializer<NorthwindDb>(
new RecreateDatabaseIfModelChanges<NorthwindDb>());
興味深い点は、これらの変更を加えたら、efがfksを自動的に推測するということです。 注文詳細 クラスと関係を作成します 注文 と 製品 に基づいたOrderIDおよびProductIDのテーブル 最初にコードの規則:
最初にコードは、名前が付けられたプロパティを推測します
<navigation property name><primary key property name>
(すなわち製品製品)、<principal class name><primary key property name>
(すなわち、製品プロダクティッド)または<primary key property name>
(つまり、ProductID)は、プライマリキーと同じデータ型を持つ、関係の外部キーを表します。複数の一致が見つかった場合、上記の順序で優先順位が与えられます。外部キーの検出は、ケースに敏感ではありません。
他のヒント
key]属性を持つキーフィールドをマークします。複合キーの場合、[列(順序= x)]を追加する必要があります。https://msdn.microsoft.com/en-us/data/jj591583.aspx