Ответ 1
Поддержка сложных типов в настоящее время находится на отставании https://github.com/aspnet/EntityFramework/issues/246
Я использую свойство собственного класса внутри модели данных 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 и помещать все это в одну таблицу?
Поддержка сложных типов в настоящее время находится на отставании https://github.com/aspnet/EntityFramework/issues/246
В качестве обновления, основанного на одном из ваших комментариев выше, вы теперь используете синтаксис 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
).
Диего Вега объявила Собственные сущности и разделение таблиц, которая должна быть другим подходом и альтернативой сложным типам.
Не могу поделиться своими личными впечатлениями, потому что я не проверял это лично, но Джули Лерман, похоже, удовлетворены...
Использование:
modelBuilder.Owned<T>:
Пример:
public MyDbContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Owned<Rate>();
}
}
Вы можете просто поставить [NotMapped] выше
public class Rate
{
public int ID { get; set; }
[NotMapped]
public Money Price = new Money();
}
как это.