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?
Support for complex types is currently on the backlog https://github.com/aspnet/EntityFramework/issues/246
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
).