Using [ComplexType] in Entity Framework Core

asp.net-core-mvc entity-framework-core

Question

I'm using a property of my own class inside EF Core data model.

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();
}

My problem is that when I try to create a migration, EF Core reports a error.

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

If I declare a key, a separate table for "Money" is created, which is not what I'm looking for.

Is there any way to use ComplexType in EF Core and put it all into a single table?

Accepted Answer

Support for complex types is currently on the backlog https://github.com/aspnet/EntityFramework/issues/246


Popular Answer

As an update based on one of your comments above, you now use the OwnsOne syntax for this using the Fluent API in your DbContext's OnModelCreating function.

[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);
         });
     }
}

I'm not actually sure if it makes use of the ComplexTypeAttribute or not. But when I generated my migration via Add-Migration, it generated as expected for the old ComplexType documentation this way (i.e. table named Rate has column Price_Amount).




Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Is this KB legal? Yes, learn why
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Is this KB legal? Yes, learn why