.net - ¿Puede una columna LINQ to SQL IsDiscriminator NO heredar?
asp.net linq-to-sql (1)
Estoy diseñando mi base de datos y la 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 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 configuré 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 LINQ to SQL IsDiscriminator ser nulable o falsa? esto funcionara?
El problema aquí es que está tratando de dividir su clase entre dos tablas, RootPage y Page.
Lamentablemente, LINQ to SQL solo admite herencia de tabla única, por lo que esto no funcionaría.
Necesitaría combinar las dos definiciones de tabla juntas y hacer que los campos específicos de RootPage sean nulables. p.ej
Page
----
PK PageId
HtmlTitle
PageHeading
MetaDescription
IsRoot
FavIcon (Nullable)
StyleSheet (Nullable)
MasterPage (Nullable)
Luego establecería IsRoot como el discriminador y marcaría la clase Page como el tipo predeterminado y RootPage como la clase para el valor del discriminador de ''Verdadero''.
Una alternativa si no te importa que las cosas se lean solo sería hacer una vista que uniera las dos tablas y basar las clases en eso.
Una tercera opción podría ser considerar la 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 tu clase RootPage tenga todas esas propiedades, en su lugar solo expondrá la propiedad raíz donde residen realmente.