2015-08-09 29 views
10

Sto utilizzando una proprietà della mia classe all'interno del modello di dati EF Core.Utilizzo di [ComplexType] in 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(); 
} 

Il mio problema è che quando provo a creare una migrazione, EF Core segnala un errore.

Microsoft.Data.Entity.Metadata.ModelItemNotFoundException: The entity type 'RentABike.Models.Money' requires a key to be defined. 

Se io dichiaro un tasto, viene creata una tabella separata per "Money", che non è quello che sto cercando.

C'è un modo per utilizzare ComplexType in EF Core e inserirlo in un'unica tabella?

risposta

13

Il supporto per i tipi complessi è attualmente sul portafoglio ordini https://github.com/aspnet/EntityFramework/issues/246

+3

È supportato ancora o sto facendo qualcosa di sbagliato? Devi dichiarare un oggetto complesso usando fluentApi? – Gillardo

+2

E 'finalmente supportato in EF Core 2.0: https://docs.microsoft.com/en-us/ef/core/what-is-new/ Devi però usare delle API fluenti per configurarlo, le annotazioni sono non ancora supportato. –

1

si può semplicemente mettere [notmapped] sopra

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

come questo.

+0

Questo non lo metterà nel db –

+0

@SergeyKandaurov yess come classe Money non ha alcun valore di chiave primaria quindi non è un'entità..e se invece non è un'entità allora non sarà mappato a db ..ma si può usarlo esternamente ma nessun valore di questo verrà memorizzato in db –

0

Come aggiornamento basato su uno dei commenti sopra, ora si utilizza la sintassi OwnsOne per questo utilizzando l'API Fluent nella funzione OnModelCreating di 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); 
     }); 
    } 
} 

io non sono realmente sicuro se fa uso del ComplexTypeAttribute o meno. Ma quando ho generato la mia migrazione tramite Add-Migration, è stato generato come previsto per la vecchia documentazione ComplexType in questo modo (ad esempio la tabella denominata Rate ha la colonna Price_Amount).

Problemi correlati