Supponiamo che io abbia i seguenti oggetti:
Entità:
public class MyEntity : NamedEntity
{
}
public abstract class NamedEntity : VersionedEntity
{
public LocalizedText Name { get; set; }
}
Oggetto complesso (LocalizedText):
public class LocalizedText : ILocalized<string>
{
protected LocalizedText()
{
}
public LocalizedText(string en, string de = null, string fr = null)
{
En = en;
De = de;
Fr = fr;
}
public string En { get; set; }
public string De { get; set; }
public string Fr { get; set; }
}
Con questo, ottengo la seguente eccezione:
System.InvalidOperationException: 'The entity type 'LocalizedText' requires a primary key to be defined.'
Non voglio creare un'entità da LocalizedText
, ma voglio che sia archiviata nel DB in colonne della tabella MyEntity, ad esempio Nome_EN, Nome_DE e Nome_FR.
Come posso raggiungere questo obiettivo?
Ho trovato la soluzione qui https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-entity-framework-core-2-0/#owned-entities-and-table-splitting
Per il codice sopra ho adattato la mia implementazione DbContext
con:
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<MyEntity>()
.OwnsOne(r => r.Name);
}
Il risultato è il seguente CREATE (parti irrilevanti mascherate in [...]):
CREATE TABLE [dbo].[MyEntity](
[...]
[Name_En] [nvarchar](max) NULL,
[Name_De] [nvarchar](max) NULL,
[Name_Fr] [nvarchar](max) NULL,