Kann eine LINQ to SQL IsDiscriminator erben Spalte NICHT?
-
09-06-2019 - |
Frage
Ich bin die Gestaltung meiner Datenbank und LINQ to SQL ASP.NET Web-Anwendung.
Stellen Sie sich vor Ich habe zwei Arten von Seiten: normal und Wurzel. Einige Seiten sind Wurzeln. Einige Seiten sind es nicht.
Ich habe eine Seite Datenbanktabelle und eine Rootpage Datenbanktabelle:
Page
----
PK PageId
HtmlTitle
PageHeading
MetaDescription
IsRoot
RootPage
--------
FK PK PageId
FavIcon
StyleSheet
MasterPage
Ich glaube, dass, wenn in meiner DBML Datei ich die IsDiscriminator Eigenschaft der IsRoot Spalte, dann wird meine Rootpage Klasse der Page-Klasse erbt.
Ich möchte in meinem Code so arbeiten können:
MyDataContext db = new MyDataContext();
var roots = from p in db.Pages
where p is RootPage
select (RootPage)p;
Oder wie folgt:
RootPage r = new RootPage();
r.HtmlTitle = "Foo";
r.FavIcon = "bar.ico";
...
db.Pages.Add(r);
db.SubmitChanges();
Kann eine LINQ to SQL IsDiscriminator Spalte Nullwerte enthalten oder falsch sein? Wird diese Arbeit?
Lösung
Das Problem hierbei ist, dass Sie versuchen, Ihre Klasse zwischen zwei Tabellen, Rootpage und Seite zu teilen.
Leider einzelne Tabelle inheritence to SQL LINQ unterstützt nur so ist dies nicht funktionieren würde.
Sie müssten die beiden Tabellendefinitionen zusammen und machen die Rootpage spezifische Felder auf NULL festlegbare verschmelzen. z.
Page
----
PK PageId
HtmlTitle
PageHeading
MetaDescription
IsRoot
FavIcon (Nullable)
StyleSheet (Nullable)
MasterPage (Nullable)
Sie würden dann IsRoot stellen Sie den Diskriminator sein und die Page-Klasse als Standardtyp und Rootpage als die Klasse für den Unterscheidungswert ‚True‘ markieren.
Eine Alternative, wenn man nicht denkt, die Dinge lesen würde nur eine Ansicht, die verbunden die beiden Tabellen zusammen und stützen die Klassen aus, dass machen sein.
Eine dritte Option könnte sein, Zusammensetzung zu prüfen, wie die Rootpage Tabelle Root-Umbenennung und eine Assoziation zwischen Rootpage und Wurzel zu schaffen. Dies würde bedeuten, dass statt Ihrer Rootpage Klasse all diese Eigenschaften wäre es stattdessen nur die Root-Eigenschaft aussetzen, wo sie tatsächlich befinden.