2015-08-09 16 views
10

Używam właściwości własnej klasy wewnątrz modelu danych EF Core.Używanie [ComplexType] w 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(); 
} 

Mój problem polega na tym, że kiedy próbuję utworzyć migrację, EF Core zgłasza błąd.

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

Jeśli zadeklaruję klucz, zostanie utworzona osobna tabela "Pieniądze", co nie jest tym, czego szukam.

Czy istnieje sposób na użycie ComplexType w EF Core i umieścić go w jednej tabeli?

Odpowiedz

13

Wsparcie dla typów złożonych jest obecnie na zaległości https://github.com/aspnet/EntityFramework/issues/246

+3

Czy jest to już obsługiwane lub czy robię coś nie tak? Czy musisz zadeklarować obiekt jako złożony przy użyciu fluentApi? – Gillardo

+2

Jest ostatecznie obsługiwany w EF Core 2.0: https://docs.microsoft.com/en-us/ef/core/what-is-new/ Musisz użyć płynnego API, aby go skonfigurować, ale adnotacje są nie jest jeszcze obsługiwany. –

1

można po prostu umieścić [NotMapped] powyżej

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

takiego.

+0

To nie przełoży go na db –

+0

@SergeyKandaurov yess, ponieważ klasa Money nie ma wartości klucza głównego, więc nie jest jednostką .. i jeśli nie jest obiektem, to nie będzie mapowana na db ... ale możesz używaj go zewnętrznie, ale żadna jego wartość nie będzie przechowywana w db –

0

Jako aktualizacja oparta na jednym z twoich komentarzy powyżej, teraz używasz składni OwnsOne dla tego przy użyciu Fluent API w swojej funkcji DbContext za 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); 
     }); 
    } 
} 

Nie jestem pewien, czy to rzeczywiście sprawia, że ​​korzystanie z ComplexTypeAttribute czy nie. Ale kiedy wygenerowałem moją migrację przez Add-Migration, wygenerowałem ją zgodnie z oczekiwaniami dla starej dokumentacji ComplexType w ten sposób (tj. Tabela o nazwie Rate ma kolumnę Price_Amount).

Powiązane problemy