2015-08-09 4 views
10

Я использую свойство собственного класса внутри модели данных EF Core.Использование [ComplexType] в Entity Framework 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 и поместить все это в одну таблицу?

ответ

13

Поддержка сложных типов в настоящее время на отставании https://github.com/aspnet/EntityFramework/issues/246

+3

Поддерживается ли это, или я делаю что-то неправильно? Вам нужно объявить объект сложным, используя fluentApi? – Gillardo

+2

Наконец-то он поддерживается в EF Core 2.0: https://docs.microsoft.com/en-us/ef/core/what-is-new/ Чтобы настроить его, вам нужно использовать некоторые из API, хотя аннотации пока не поддерживается. –

1

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

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

как это.

+0

Это не будет помещать его в db –

+0

@SergeyKandaurov yess, поскольку класс Money не имеет никакого значения первичного ключа, поэтому он не является сущностью ... и если он не является сущностью, тогда он не будет отображаться на db .. но вы можете используйте его снаружи, но никакая ценность этого не будет сохранена в db –

0

В качестве обновления, основанного на одном из ваших комментариев выше, вы используете синтаксис OwnsOne для этого, используя Fluent API в своей функции OnModelCreating DbContext.

[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).