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à?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top