2011-06-11 8 views
0

내가 나는 그것이 같은 것이라고 생각, 다른 엔티티 클래스가 파생 할 수있는 기본 트리 노드 클래스를 설계 할 : 그러나트리 노드 디자인 우선

public abstract class BaseTreeNode 
{ 
    public string Id{get;set;} 

    public string Name{get;set;} 

    public string ParentId{get;set;} 

    [ForeignKey("ParentId")] 
    public BaseTreeNode ParentNode{get;set;} 
} 

public class MenuNode:BaseTreeNode 
{ 

} 

, 그것은하지 않는 것 MenuNode 클래스로 일부 계층 구조를 만들려고 할 때 작동합니다. 그것은 SqlException 던졌습니다 : 잘못된 개체 이름 'dbo.BaseTreeNode'SaveChanges 메서드를 호출하면.

나는 그것이 추상적 클래스이므로 'ParentNode'속성에 관한 문제라고 생각했다. 이 경우 엔터티 프레임 워크 4.1 코드를 사용하여 클래스를 어떻게 디자인해야합니까?

감사합니다.

+0

누군가 나를 도울 수 있습니까? – NicolasZ

+0

문제가 'ParentNode' 속성이라고 생각하지 않습니다. 이 모델은 유효합니다. ('PrarentId'는 예외 일뿐입니다.) 문제는 다른 곳에서 발생해야합니다. 1) DbSet 속성과 함께 DbContext, 2) Fluent 매핑이 있으면이를 매핑 할 수 있으며, 3) 예외를 throw하는 코드를 표시 할 수 있습니까? – Slauma

답변

0

이 접근법의 문제점은 성능입니다. DB (Menu/SubMenu, Category/Subcategory)에 여러 유형의 트리를 저장하려고 할 수 있지만 이러한 유형의 상속으로 인해 모든 테이블이 단일 테이블에 함께 저장됩니다. 이 질문을보십시오 : What are the pros and cons of one master base table which all entities inherit from?

문제는 트리 유형에 관계없이 모든 유형의 노드를 쿼리해야하는지 여부입니다.

+0

사실 나는 당신이 틀렸다고 생각한다. Loren, EF는 파생 된 각 유형에 대한 테이블을 생성 할 것이므로 DB의 MenuNode라는 테이블과 그가 만든 다른 노드 유형을 사용해야한다. 기본 유형은 실제로 aC# 컨텍스트에서만 사용된다. clr이 완전한 객체를 만들도록 허용합니다. – War

+0

아니요, 방금 시도했습니다. 기본 동작은 table-per-hierarchy 상속입니다. 즉 모든 하위 클래스가 단일 테이블에 저장되고 discriminator 열이 하위 클래스를 구별하는 데 사용됩니다. 이 예제에서 결과 테이블의 이름은 BaseTreeNodes이고 식별자 열은 "[Discriminator] [nvarchar] (128) NOT NULL"로 정의됩니다. –

+0

특이한 점 ... 최근에 EF 코드로 기본 문서 관리 시스템을 작성했습니다. 내 C# 코드에서이 접근법. 나는 3 개의 클래스 (FileSystemObject, Directory, File)로 끝내고 후자는 2 번째로 상속 받았다. 그리고 db (Directory, Files)에 2 개의 테이블이있다. – War

관련 문제