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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top