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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top