EF Coreデータモデル内で自分のクラスのプロパティを使用しています。
public class Currency
{
public string Code { get; set; }
public string Symbol { get; set; }
public string Format { get; set; }
}
[ComplexType]
public class Money
{
public int? CurrencyID { get; set; }
public virtual Currency Currency { get; set; }
public double? Amount { get; set; }
}
public class Rate
{
public int ID { get; set; }
public Money Price = new Money();
}
私の問題は、移行を作成しようとすると、EF Coreがエラーを報告することです。
Microsoft.Data.Entity.Metadata.ModelItemNotFoundException: The entity type 'RentABike.Models.Money' requires a key to be defined.
キーを宣言すると、「お金」の別のテーブルが作成されますが、これは私が探しているものではありません。
EF CoreでComplexTypeを使用してすべてを1つのテーブルに入れる方法はありますか?
複合型のサポートは現在バックログにあります https://github.com/aspnet/EntityFramework/issues/246
上記のコメントの1つに基づく更新として、DbContextのOwnsOne
関数でFluent APIを使用してOnModelCreating
構文を使用します。
[ComplexType]
public class Money
{
public double? Amount { get; set; }
}
public class Rate
{
[Key]
public long Id { get; set; }
public Money Price { get; set; }
}
public MyDbContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Rate>(entity =>
{
entity.OwnsOne(e => e.Currency);
});
}
}
ComplexTypeAttribute
を使用しているかどうかは、実際にはわかりません。しかし、Add-Migrationを介して移行を生成すると、古いComplexTypeのドキュメントで期待どおりに生成されました(つまり、Rate
という名前のテーブルには列Price_Amount
があります)。
Diego Vega 発表 所有エンティティとテーブル分割 、これは異なるアプローチであり、複合型の代替となるはずです。
個人的にこれをチェックしていないので、個人的な印象を共有することはできませんが、 Julie Lerman 、 満足したようです ...
使用する:
modelBuilder.Owned<T>:
例:
public MyDbContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Owned<Rate>();
}
}