107 messaggi dal 08 febbraio 2007
E' possibile mappare le tabelle Clienti/Fornitori con una tabella "generica" ?
in SQL farei ..
SELECT * FROM Clienti as a, GenericAttribute as b WHERE b.EntityId = a.Id AND b.EntityName = 'Cliente'
è possibile fare altrettanto con EntityFrameworkCore ?



**** STRUTTURA DB *****

Clienti
---------
Id (int)
Name (varchar)
Address (varchar)

Fornitori
-----------
Id (int)
Name (varchar)
Address (varchar)

GenericAttribute
----------------
Id (int)
EntityId (int)
EntityName(varchar)
AttName (varchar)
Value (varchar)


**** CLASSI *****
public class Cliente
{
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }

public ICollection GenericAttributes { get; set; }
}

public class Fornitore
{
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }

public ICollection GenericAttributes { get; set; }
}

public class GenericAttribute
{
public int Id { get; set; }
public int EntityId { get; set; }
public string EntityName { get; set; }
public string AttName { get; set; }
public string Value { get; set; }
}

**** DATA *****
Clienti
---------
10,'Cliente 1','50 north street'
11,'Cliente 2','15 south street'

Fornitori
---------
100,'Fornitore 1','21 West 52nd Street'
101,'Fornitore 2','1249 Tongass Avenue'

GenericAttribute
----------------
1,10,'Cliente','birthday','12/02/1964'
2,11,'Cliente','age','54'
3,100,'Fornitore','category','forniture'
4,101,'Fornitore','category','mechanics'
10.683 messaggi dal 09 febbraio 2002
Contributi
Ciao,
puoi farlo perché Entity Framework Core supporta il modello di ereditarietà Table-Per-Hierarchy.
Leggi qui:
https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/inheritance
https://www.learnentityframeworkcore.com/inheritance/table-per-hierarchy
http://www.linqitalia.com/script/435/Mappare-Ereditarieta-Entity-Framework-Core.aspx

Dovrai far ereditare le classi Cliente e Fornitore da una classe base che conterrà le proprietà comuni ad entrambi. Poi fai il mapping come indicato nella documentazione.

ciao,
Moreno
Modificato da BrightSoul il 09 marzo 2018 22.21 -

Enjoy learning and just keep making
107 messaggi dal 08 febbraio 2007
Ho letto l'articolo, penso potrebbe funzionare,
devo creare una classe "AttributiComune" che sarà ereditata da Clienti e Fornitori
ma come faccio a filtrare i record con i dati che riguardano solo ai Client e ai Fornitori ?
mi manca il passaggio che corrisponde al comando SQL "AND b.EntityName = 'Cliente'"
10.683 messaggi dal 09 febbraio 2002
Contributi
Ciao, puoi usare il metodo OfType<T>.

var clienti = context.AttributiComune.OfType<Cliente>();
var fornitori = context.AttributiComune.OfType<Fornitore>();


Vedi se trovi un nome migliore di "AttributiComune" per la classe base e per il DbSet. Clienti e Fornitori sono aziende? In questo caso la classe base si potrebbe chiamare Azienda e il DbSet Aziende.

ciao,
Moreno

Enjoy learning and just keep making
107 messaggi dal 08 febbraio 2007
Forse ho trovato una soluzione più semplice...


modelBuilder.Entity<GenericAttribute>(entity =>
{
entity.ToTable("GenericAttribute");

modelBuilder.Entity<GenericAttribute>()
.HasDiscriminator<string>("EntityName")
.HasValue<FornitoreGenericAttribute>("Fornitore")
.HasValue<ClienteGenericAttribute>("Cliente");
});
10.683 messaggi dal 09 febbraio 2002
Contributi
Ciao,
esatto, quello è proprio il codice che serve a realizzare il mapping Table-Per-Hierarchy.
Ho aggiornato il link per i posteri, perché riguardando la pagina della documentazione mi sembra che i tipi derivati siano mappati ad altre tabelle.


ma come faccio a filtrare i record con i dati che riguardano solo ai Client e ai Fornitori ?

Oltre all'OfType già citato, puoi creare degli altri DbSet del tipo specifico.
public DbSet<Cliente> Clienti { get; set; }
public DbSet<Fornitore> Fornitori { get; set; }


ciao,
Moreno
Modificato da BrightSoul il 09 marzo 2018 20.38 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.