Uma coluna LINQ to SQL IsDiscriminator NÃO pode ser herdada?
-
09-06-2019 - |
Pergunta
Estou projetando meu banco de dados e aplicativo da web LINQ To SQL ASP.NET.
Imagine que tenho dois tipos de páginas:normal e raiz.Algumas páginas são raízes.Algumas páginas não são.
Eu tenho uma tabela de banco de dados Page e uma tabela de banco de dados RootPage:
Page
----
PK PageId
HtmlTitle
PageHeading
MetaDescription
IsRoot
RootPage
--------
FK PK PageId
FavIcon
StyleSheet
MasterPage
Acho que se dentro do meu arquivo DBML eu definir a propriedade IsDiscriminator da coluna IsRoot, então minha classe RootPage herdará a classe Page.
Quero poder trabalhar assim no meu código:
MyDataContext db = new MyDataContext();
var roots = from p in db.Pages
where p is RootPage
select (RootPage)p;
Ou assim:
RootPage r = new RootPage();
r.HtmlTitle = "Foo";
r.FavIcon = "bar.ico";
...
db.Pages.Add(r);
db.SubmitChanges();
Uma coluna LINQ to SQL IsDiscriminator pode ser anulável ou falsa?Isso vai funcionar?
Solução
O problema aqui é que você está tentando dividir sua classe entre duas tabelas, RootPage e Page.
Infelizmente, o LINQ to SQL oferece suporte apenas à herança de tabela única, portanto isso não funcionaria.
Você precisaria mesclar as duas definições de tabela e tornar os campos específicos do RootPage anuláveis.por exemplo.
Page
----
PK PageId
HtmlTitle
PageHeading
MetaDescription
IsRoot
FavIcon (Nullable)
StyleSheet (Nullable)
MasterPage (Nullable)
Você então definiria IsRoot como o discriminador e marcaria a classe Page como o tipo padrão e RootPage como sendo a classe para o valor do discriminador 'True'.
Uma alternativa, se você não se importasse que as coisas fossem lidas apenas, seria criar uma visualização que unisse as duas tabelas e baseasse as classes nisso.
Uma terceira opção pode ser considerar a composição, como renomear a tabela RootPage para Root e criar uma associação entre RootPage e Root.Isso significaria que, em vez de sua classe RootPage ter todas essas propriedades, ela exporia apenas a propriedade Root onde elas realmente residem.