문제

저는 데이터베이스와 LINQ To SQL ASP.NET 웹 응용 프로그램을 디자인하고 있습니다.

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

페이지 데이터베이스 테이블과 RootPage 데이터베이스 테이블이 있습니다.

      Page
      ----
   PK PageId
      HtmlTitle
      PageHeading
      MetaDescription
      IsRoot

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

DBML 파일 내에서 IsRoot 열의 IsDiscriminator 속성을 설정하면 RootPage 클래스가 Page 클래스를 상속하게 될 것입니다.

내 코드에서 다음과 같이 작업할 수 있기를 원합니다.

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();

LINQ to SQL IsDiscriminator 열이 null을 허용하거나 false일 수 있나요?이게 효과가 있을까요?

도움이 되었습니까?

해결책

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

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

두 테이블 정의를 함께 병합하고 RootPage 관련 필드를 null 허용으로 만들어야 합니다.예를 들어

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

그런 다음 IsRoot를 판별자로 설정하고 Page 클래스를 기본 유형으로 표시하고 RootPage를 판별자 값 'True'에 대한 클래스로 표시합니다.

읽기 전용인 것을 개의치 않는 경우 대안은 두 테이블을 함께 결합하고 이를 기반으로 클래스를 기반으로 하는 뷰를 만드는 것입니다.

세 번째 옵션은 RootPage 테이블의 이름을 Root로 바꾸고 RootPage와 Root 간의 연결을 만드는 등의 구성을 고려하는 것입니다.이는 RootPage 클래스가 해당 속성을 모두 갖는 대신 실제로 존재하는 루트 속성만 노출한다는 의미입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top