Una colonna LINQ to SQL IsDiscriminator NON può ereditare?
-
09-06-2019 - |
Domanda
Sto progettando il mio database e l'applicazione Web LINQ To SQL ASP.NET.
Immagina di avere due tipi di pagine:normale e radice.Alcune pagine sono radici.Alcune pagine no.
Ho una tabella del database Page e una tabella del database RootPage:
Page
----
PK PageId
HtmlTitle
PageHeading
MetaDescription
IsRoot
RootPage
--------
FK PK PageId
FavIcon
StyleSheet
MasterPage
Penso che se nel mio file DBML imposto la proprietà IsDiscriminator della colonna IsRoot, la mia classe RootPage erediterà la classe Page.
Voglio essere in grado di lavorare in questo modo nel mio codice:
MyDataContext db = new MyDataContext();
var roots = from p in db.Pages
where p is RootPage
select (RootPage)p;
O così:
RootPage r = new RootPage();
r.HtmlTitle = "Foo";
r.FavIcon = "bar.ico";
...
db.Pages.Add(r);
db.SubmitChanges();
Una colonna LINQ to SQL IsDiscriminator può essere nullable o false?Funzionerà?
Soluzione
Il problema qui è che stai cercando di dividere la tua classe tra due tabelle, RootPage e Page.
Sfortunatamente LINQ to SQL supporta solo l'ereditarietà di una singola tabella, quindi non funzionerebbe.
Sarebbe necessario unire insieme le due definizioni di tabella e rendere nulli i campi specifici di RootPage.per esempio.
Page
----
PK PageId
HtmlTitle
PageHeading
MetaDescription
IsRoot
FavIcon (Nullable)
StyleSheet (Nullable)
MasterPage (Nullable)
Dovresti quindi impostare IsRoot come discriminatore e contrassegnare la classe Page come tipo predefinito e RootPage come classe per il valore del discriminatore "True".
Un'alternativa se non ti dispiace che le cose vengano solo lette sarebbe quella di creare una vista che unisse le due tabelle insieme e basare le classi su quella.
Una terza opzione potrebbe essere quella di prendere in considerazione la composizione, ad esempio rinominando la tabella RootPage in Root e creando un'associazione tra RootPage e Root.Ciò significherebbe che invece di avere tutte quelle proprietà nella classe RootPage, esporrebbe invece solo la proprietà Root dove risiedono effettivamente.