LINQ to SQL IsDiscriminator 열이 상속되지 않을 수 있나요?
-
09-06-2019 - |
문제
저는 데이터베이스와 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 클래스가 해당 속성을 모두 갖는 대신 실제로 존재하는 루트 속성만 노출한다는 의미입니다.