web-dev-qa-db-ja.com

Entity Framework Coreでの[ComplexType]の使用

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つのテーブルに入れる方法はありますか?

19

複合型のサポートは現在バックログにあります https://github.com/aspnet/EntityFramework/issues/246

14
ErikEJ

上記のコメントの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があります)。

9
Reddog

Diego Vega 発表 所有エンティティとテーブル分割 、これは異なるアプローチであり、複合型の代替となるはずです。

個人的にこれをチェックしていないので、個人的な印象を共有することはできませんが、 Julie Lerman満足したようです ...

3
Shimmy

使用する:

modelBuilder.Owned<T>: 

例:

public MyDbContext : DbContext
{
     protected override void OnModelCreating(ModelBuilder modelBuilder)
     {
         modelBuilder.Owned<Rate>();
     }
}
2
pixparker