EF Core non supporta la mappatura dei tipi complessi.
Se avessi un oggetto come:
public class Entity {
public string StringProp {get; set;}
public SubEntity NestedEntity {get; set;}
}
dove SubEntity è:
public class SubEntity{
public int IntProp {get; set;}
}
Come posso mappare questo ad una tabella che ha colonne per StringProp e IntProp. Fondamentalmente un record nella tabella è composto dalle proprietà di Entity e Subntity.
Ho provato a ignorare SubEntity e ad esporre le sue proprietà in Entity ma ciò non funziona perché quando NestedEntity viene ignorato, qualsiasi proprietà su Entity che usa le sue proprietà non ha valori.
C'è qualche altra opzione rispetto alla creazione di una classe che ha tutte le proprietà del tipo complesso o refactoring del database?
Ho deciso di andare con una classe che contiene tutte le proprietà e le mappe relative a tutte le colonne della tabella richieste. Funziona bene come soluzione alternativa. Si aggiornerà quando è disponibile il supporto per tipi complessi in EF Core.
Le mappature ComplexType sono ora disponibili da EF Core 2.0. Ci sono attualmente due modi per farlo, di cui sono a conoscenza.
Via attributi
Se non si specifica l'attributo Column, Entity Framework non può mappare le proprietà alla colonna corretta nelle tabelle esistenti senza migrazioni.
ad esempio, può mappare a Address_StreetAddress
using System.ComponentModel.DataAnnotations.Schema;
public class User
{
public int Id { get; set; }
// The complex property we want to use
public Address Address { get; set; }
public string UserName{ get; set; }
}
// Lets Entity Framework know this class is a complex type
[ComplexType]
public class Address
{
// Maps the property to the correct column name
[Column("Address")]
public string StreeAddress { get; set; }
[Column("City")]
public string City { get; set; }
[Column("State")]
public string State { get; set; }
[Column("Zip")]
public string ZipCode { get; set; }
}
Via API Fluent
Se non si specifica HasColumnName, Entity Framework non può mappare le proprietà alla colonna corretta nelle tabelle esistenti senza migrazioni.
ad esempio, può mappare a Address_StreetAddress
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
public class MyContext: DbContext
{
public DbSet<User> Users{ get; set; }
public MyContext(DbContextOptions<MyContext> options)
: base(options) { }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<User>(table =>
{
// Similar to the table variable above, this allows us to get
// an address variable that we can use to map the complex
// type's properties
table.OwnsOne(
x => x.Address,
address =>
{
address.Property(x => x.City).HasColumnName("City");
address.Property(x => x.State).HasColumnName("State");
address.Property(x => x.StreetAddress).HasColumnName("Address");
address.Property(x => x.SuiteNumber).HasColumnName("SuiteNumber");
address.Property(x => x.ZipCode).HasColumnName("Zip");
});
});
}
}