.net asp.net linq linq-to-sql inheritance

.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.