Pregunta

Estoy diseñando mi base de datos y mi aplicación web LINQ To SQL ASP.NET.

Imagina que tengo dos tipos de páginas:normal y raíz.Algunas páginas son raíces.Algunas páginas no lo son.

Tengo una tabla de base de datos de página y una tabla de base de datos de RootPage:

      Page
      ----
   PK PageId
      HtmlTitle
      PageHeading
      MetaDescription
      IsRoot

      RootPage
      --------
FK PK PageId
      FavIcon
      StyleSheet
      MasterPage

Creo que si dentro de mi archivo DBML configuro la propiedad IsDiscriminator de la columna IsRoot, entonces mi clase RootPage heredará la clase Page.

Quiero poder trabajar así en mi código:

MyDataContext db = new MyDataContext();

var roots = from p in db.Pages
            where p is RootPage
            select (RootPage)p;

O así:

RootPage r = new RootPage();
r.HtmlTitle = "Foo";
r.FavIcon = "bar.ico";
...
db.Pages.Add(r);
db.SubmitChanges();

¿Puede una columna IsDiscriminator de LINQ to SQL ser anulable o falsa?esto funcionara?

¿Fue útil?

Solución

El problema aquí es que estás intentando dividir tu clase entre dos tablas, RootPage y Page.

Lamentablemente, LINQ to SQL solo admite la herencia de una sola tabla, por lo que esto no funcionaría.

Debería fusionar las dos definiciones de tabla y hacer que los campos específicos de RootPage sean anulables.p.ej.

   Page
   ----
PK PageId
   HtmlTitle
   PageHeading
   MetaDescription
   IsRoot
   FavIcon (Nullable)
   StyleSheet (Nullable)
   MasterPage (Nullable)

Luego, establecería IsRoot como discriminador y marcaría la clase Page como el tipo predeterminado y RootPage como la clase para el valor discriminador de 'True'.

Una alternativa, si no le importa que las cosas se lean solo, sería crear una vista que uniera las dos tablas y basar las clases en eso.

Una tercera opción podría ser considerar una composición como cambiar el nombre de la tabla RootPage a Root y crear una asociación entre RootPage y Root.Esto significaría que en lugar de que su clase RootPage tenga todas esas propiedades, solo expondría la propiedad Root donde realmente residen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top