Использование [ComplexType] в Entity Framework Core

Я использую свойство собственного класса внутри модели данных 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.

Если я объявляю ключ, создается отдельная таблица для "Деньги", и это не то, что я ищу.

Есть ли способ использовать ComplexType в EF Core и помещать все это в одну таблицу?

Ответ 2

В качестве обновления, основанного на одном из ваших комментариев выше, вы теперь используете синтаксис OwnsOne для этого, используя Fluent API в своей функции DbContext 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).

Ответ 4

Использование:

modelBuilder.Owned<T>: 

Пример:

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

Ответ 5

Вы можете просто поставить [NotMapped] выше

public class Rate
{
    public int ID { get; set; }
    [NotMapped]
    public Money Price = new Money();
}

как это.