2010-01-14 3 views
8

다른 데이터 모델을 다형성으로 만들려면 훨씬 더 쉬울 새 프로젝트 작업을 시작하고 있습니다. Entity Framework 4.0 (릴리스되었을 때)을 사용하고 있지만 실제로 작동 할 수 있는지 여부를 결정할 수 없었습니다..NET Polymorphic Data Framework가 있습니까

다음은 기본적인 시나리오입니다. 필자는 주석 시스템을 구현했으며 여러 다른 유형의 모델에 연결할 수 있기를 원합니다. 어쩌면 사람의 프로필에 대한 의견과 웹 페이지에 대한 의견이 필요합니다. 과거에이 작업을 수행하는 방법은 웹 페이지와 주석 테이블 간의 관계와 별도로 사람 테이블과 주석 테이블 간의 관계를 만드는 것입니다. 그러나 이것은 데이터베이스에서 지나치게 복잡한 테이블 구조로 이어질 것이라고 생각합니다.

내가 의견을 원하는 개체에 인터페이스를 추가 한 다음 단일 관계로 데이터베이스의 테이블 구조를 단순화 할 수 있다면 가장 좋을 것입니다.

내가 겪고있는 문제는이 유형의 작업을 수행하는 방법에 대한 정보를 찾기 위해 올바른 용어를 알지 못하는 것입니다. 누구든지 제공 할 수있는 도움을 주시면 대단히 감사하겠습니다.

답변

2

당신이 언급 형 불가지론 (단지 기초를, 아이디, 날짜 & 시간 및 텍스트 내용 등)로 당신의 "코멘트 테이블을"디자인 할 경우, 다음 수 그들 모두를 매핑하는 하나의 추가 표를 사용하십시오.

public interface ICommentable 
{ 
    int CommentTypeCode 
    int Id 
    ... 
} 

는 이제 매퍼 테이블에 열을 포함 : "

  • 은 ID로,

    하나 개의 테이블에 가서 모든 귀하의 의견

  • 을 comment_id target_object_id
    • comment_type_code을 귀하의 다양한 대상 객체 "에는 모두 같은 유형의 ID가 있어야합니다.

      이제는 코멘트 테이블이나 매퍼 테이블을 변경하지 않고 임의로 새로운 "주석 가능한"객체를 시스템에 추가 할 수 있습니다. 새로운 유형 코드를 지정하고 필수 Id 컬럼이있는 테이블을 생성하면됩니다.

  • +0

    네, 이것은 제가 생각하고있는 것과 정확히 같은 유형입니다. 나는 타입 캐스팅을 투명하게 처리 할 수있는 방법이 있기를 바랬지 만, 총알을 물고 그것을해야만하는 것처럼 보입니다. 이 경우 target_object_id와 comment_type을 확인해야합니다. target_type은 대상 객체의 System.Type 일뿐입니다. 나는 그걸로 많은 일을 할 필요가 없으므로 배울 것입니다. – Josh

    +0

    글쎄, 당신의 목표는 내가 데이터베이스에서 원래의 질문에서 수집 한 테이블의 수를 줄이는 것이라고 가정합니다. 대신 각 코멘트 유형에 대해 "매퍼 테이블"을 만들지 만 모든 댓글을 코멘트 테이블에 보관할 수도 있습니다. post_id 열과 comment_id 열이있는 "post_comments"테이블이있는 경우보기 또는 모델에 특정 게시물 ID에 대한 설명이 필요할 때 쿼리 할 수 ​​있습니다. 유형 캐스팅은 필요하지 않습니다. – Jay

    +0

    네, 그렇습니다. 테이블의 수와 쓰여지는 코드의 양을 줄이는 것입니다. 완벽한 세계에서 Ruby의 믹스 인처럼 작동하지만 C#에서는 불가능합니다. 그것은 큰 문제가 아니며, 나는 단지 내가 뭔가를 놓치기를 바랐다. – Josh

    2

    LinqToSql 및 부분 클래스를 사용하여이를 수행합니다. 인터페이스를 구현하고자하는 각 클래스에 대해 인터페이스를 구현할 클래스를 선언하는 부분 클래스의 일부가 포함 된 도구가 아닌 파일을 생성하겠습니다. 예를 들어

    :

    생성 된 코드 :

    // this code is generated by a tool blah blah 
    partial class FooComment { 
        // all the generated crap 
        string Author { 
         // ... 
        } 
        // etc 
    } 
    

    인터페이스 :

    interface IComment{ 
        string Author{ get; } 
        // etc 
    } 
    

    내 코드 : 이제

    // lovingly hand-written by me 
    partial class FooComment : IComment { 
    } 
    

    , 당신은 어떤 그룹을 캐스팅하려는 경우 FomComments의 IComment, 우리에게 Ê 2 Cast LINQ 확장 방법 :

    db.FooComments.Cast<IComment>() 
    
    +0

    예, 이것은 제가 생각하고있는 해결책의 유형입니다.나는 타입 캐스팅을 투명하게 처리하는 방법이있을 수 있기를 바랬지 만, 제네릭 함수가 아마도 내가 얻으려고하는 최선의 방법 일 것입니다. – Josh

    관련 문제