¿Puede una columna IsDiscriminator de LINQ to SQL NO heredar?
-
09-06-2019 - |
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?
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.