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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top