Une colonne IsDiscriminator LINQ to SQL ne peut-elle pas hériter?
-
09-06-2019 - |
Question
Je conçois ma base de données et l'application Web ASP.NET LINQ To SQL.
Imaginez que j'ai deux types de pages: normale et racine. Certaines pages sont des racines. Certaines pages ne le sont pas.
J'ai une table de base de données Page et une table de base de données RootPage:
Page
----
PK PageId
HtmlTitle
PageHeading
MetaDescription
IsRoot
RootPage
--------
FK PK PageId
FavIcon
StyleSheet
MasterPage
Je pense que si, dans mon fichier DBML, je définit la propriété IsDiscriminator de la colonne IsRoot, ma classe RootPage héritera de la classe Page.
Je veux pouvoir travailler comme ça dans mon code:
MyDataContext db = new MyDataContext();
var roots = from p in db.Pages
where p is RootPage
select (RootPage)p;
Ou comme ceci:
RootPage r = new RootPage();
r.HtmlTitle = "Foo";
r.FavIcon = "bar.ico";
...
db.Pages.Add(r);
db.SubmitChanges();
Une colonne IsDiscriminator LINQ to SQL peut-elle être Nullable ou false? Cela fonctionnera-t-il?
La solution
Le problème ici est que vous essayez de diviser votre classe en deux tables, RootPage et Page.
Malheureusement, LINQ to SQL ne prend en charge que l'héritage d'une table, donc cela ne fonctionnerait pas.
Vous devez fusionner les deux définitions de table et rendre les champs spécifiques à RootPage nullables. par exemple
Page
----
PK PageId
HtmlTitle
PageHeading
MetaDescription
IsRoot
FavIcon (Nullable)
StyleSheet (Nullable)
MasterPage (Nullable)
Vous définissez ensuite IsRoot comme discriminateur et marquez la classe Page comme type par défaut et RootPage comme classe pour la valeur discriminante de 'True'.
Une alternative aux choses lues en lecture seule serait de créer une vue reliant les deux tables et de baser les classes sur celle-ci.
Une troisième option pourrait consister à envisager une composition telle que renommer la table RootPage en racine et créer une association entre RootPage et Root. Cela signifierait qu'au lieu que votre classe RootPage ait toutes ces propriétés, elle exposerait uniquement la propriété Root là où elle réside réellement.