2008-09-15 3 views
2

저는 데이터베이스와 LINQ To SQL ASP.NET 웹 응용 프로그램을 디자인하고 있습니다.LINQ to SQL IsDiscriminator 열을 상속받을 수 있습니까?

정상 및 루트라는 두 가지 유형의 페이지가 있다고 가정 해보십시오. 일부 페이지는 뿌리입니다. 일부 페이지는 그렇지 않습니다.

가 나는 페이지 데이터베이스 테이블과 RootPage 데이터베이스 테이블이 있습니다

 Page 
     ---- 
    PK PageId 
     HtmlTitle 
     PageHeading 
     MetaDescription 
     IsRoot 

     RootPage 
     -------- 
FK PK PageId 
     FavIcon 
     StyleSheet 
     MasterPage 

내가 내 DBML 파일 내 경우에는 내가 IsRoot 열의 IsDiscriminator 속성을 설정 생각을하고 내 RootPage 클래스는 페이지 클래스를 상속합니다 .

나는 내 코드에서 다음과 같이 작업 할 수있게하려면 :

MyDataContext db = new MyDataContext(); 

var roots = from p in db.Pages 
      where p is RootPage 
      select (RootPage)p; 

또는 같은

가 :

RootPage r = new RootPage(); 
r.HtmlTitle = "Foo"; 
r.FavIcon = "bar.ico"; 
... 
db.Pages.Add(r); 
db.SubmitChanges(); 

SQL IsDiscriminator 컬럼에 LINQ에 널 (NULL) 또는 거짓이 될 수 있습니까? 이게 효과가 있니?

답변

2

여기에서 문제는 클래스를 RootPage와 Page의 두 테이블로 분할하려는 것입니다.

LINQ to SQL은 단일 테이블 상속 만 지원하므로 작동하지 않습니다.

두 테이블 정의를 병합하고 RootPage 관련 필드를 Null 허용해야합니다. 예 :

Page 
    ---- 
PK PageId 
    HtmlTitle 
    PageHeading 
    MetaDescription 
    IsRoot 
    FavIcon (Nullable) 
    StyleSheet (Nullable) 
    MasterPage (Nullable) 

님의 다음 판별을하고 '참'의 판별 값의 클래스로서 기본 유형과 RootPage 같은 페이지 클래스를 표시 IsRoot을 설정합니다.

두 가지 테이블을 결합하여 클래스를 기반으로하는보기를 만드는 것이 다른 방법 일 수도 있습니다.

세 번째 옵션은 RootPage 테이블의 이름을 Root로 바꾸고 RootPage와 Root를 연결하는 것과 같은 구성을 고려하는 것입니다. 즉, RootPage 클래스 대신 이러한 모든 속성을 가진 대신 Root 속성이 실제로있는 곳에 만 노출된다는 것을 의미합니다.

+1

감사합니다. 여기에 대한 자세한 정보 : http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/01/linq-to-sql-inheritance.aspx –