복붙노트

[SQL] NHibernate에 동적 열 번호

SQL

NHibernate에 동적 열 번호

내 C # 프로젝트에서 나는 동적 열 번호를 하나 개의 테이블로 코드를 하나의 데이터베이스에 만들 필요가있다. 이처럼

------------------------------------------------------------------------------     
| Time        ¦ Element #1       | Element#2        ¦ ... ¦ Element#N        ¦
------------------------------------------------------------------------------
¦ TimeValue#1 ¦ Element#1Value#1 ¦ Element#2Value#1 ¦ ... ¦ Element#NValue#1 ¦
¦ TimeValue#2 ¦ Element#1Value#2 ¦ Element#2Value#2 ¦ ... ¦ Element#NValue#2 ¦
                                      ...
¦ TimeValue#M ¦ Element#1Value#M ¦ Element#2Value#M ¦ ... ¦ Element#NValue#M ¦
------------------------------------------------------------------------------

나는 간단한 SQL 쿼리 'SQL은 테이블 만들기'를 사용

public void AddTable(string TableName, Dictionary<string,Type> columns)
{        
    ...
    string query = @"CREATE TABLE " + TableName + "(";

    foreach (var c in columns)
    {
        SqlParameter temp = new SqlParameter();
        string t = SetSQLType(ref temp, c.Value).ToString();
        query += c.Key + " " + (t == SqlDbType.NVarChar.ToString() ? (t + "(200)") : (t)) + ",";
    }

    query = query.Substring(0, query.Length - 1);
    query += " )";
    ...
}

그러나 나는 어쩌면, 내가 예를 들어,이 더 편안 ORM을 사용할 수 있습니다, 생각 - NHibernate에 있습니다. 내가 할 수 있습니까? 나는 매핑 별 코드 및 동적 구성 요소에 대해 읽어,하지만 난 정확히 내가 내 경우 무엇을해야하는지, 확실하지 않다.

나는이 같은 뭔가가 필요, 생각 :

public class Elements
{
    public virtual DateTime Timestamp { get; set; }
    public virtual IEnumerable<double> Values { get; set; }
}

나는이 클래스를 매핑 할 수 있습니까?

해결법

  1. ==============================

    1.이 항목은 흥미 롭다. 그리고 어쩌면 그래서 첫번째보기에서 삭제하지. 개요로 내 대답은 아래 나열된 모든 소스의 요약을 가져 가라. 그리고 어쩌면 그것은 당신에게 해답을 줄 것이다.

    이 항목은 흥미 롭다. 그리고 어쩌면 그래서 첫번째보기에서 삭제하지. 개요로 내 대답은 아래 나열된 모든 소스의 요약을 가져 가라. 그리고 어쩌면 그것은 당신에게 해답을 줄 것이다.

    뷰의 C #을 관점에서,이 방법이 동적 특성에 대해 생각할 수

    public virtual IDictionary<keyType, valueType> Additional { get; set; } 
                     // (e.g. <string, object>
    
    public virtual IDictionary Additional { get; set; }
    

    이 두 가지 동적입니다. IDictionary 처리에 대한 컴파일 시간 검사가 없습니다. 더 나은 상황이 IDictinary 확인 일반 인수는 <,>. 우리가 동적 매핑에 대해 이야기하고 있기 때문에, 컴파일 시간 체크는 우리가 희생 할 수있는 것입니다 ...

    다른 매핑을하고 테이블의 다른 구조를 가지고 우리가 (대부분의 경우)에있는이 사전 중 하나에 데이터를로드합니다. 일반 행에 포함 된 데이터의 transpostion 편리 할 것이다. 비 일반은 (질문의 예로서) 열 매핑에 사용 할 수있다. 하자 모두 논의

    와하자의 시작은 더 안전 시나리오를 입력합니다. 질문에 다음 터치 솔루션 닫기

    예를 들어, 자신의 역할 / 유형에 따라 일부 엔티티 (예를 들어 계약)에 몇 사람을지도 할 수 있습니다. 1) 관리자 2) 리더 3) 시험기. 우리는 종류 / 역할 (하나의 시험기 또는 없음) 당 한 사람이있을 수 있다는 것을 알고 있다면, 우리는 그것을로 설명 할 수 있습니다 :

    public virtual IDictionary<PersonType, Person> Persons { get; set; }
    

    우리는 지금 동적입니다. 이 0 수 계약에 관한 1 1+ 사람. 그들 각각은 PersonType에 의해 고유해야합니다. 그리고 우리는 또한 런타임에 새 PersonTypes을 소개하고 계약의 관련 담당자 세트를 확장 할 수 있습니다 ...

    매핑은 다음과 같이해야한다

    <map name="Persons" table="ContractPerson" >
        <key column="ContractId"/>
         <index-many-to-many column="PersonTypeId" class="PersonType"/>
         <one-to-many class="Person"/>
    </map>
    

    이것은 6.9의 예입니다. 삼항 협회. 이 관련된 세 기관이 있고, 우리는 여전히 런타임에 유연성을해야합니까. 이미 말했듯이, 우리는 새로운 PersonTypes를 삽입하고이 계약-사람의 관계를 수정할 수 있습니다.

    (IDictiniary <문자열, 개체>와 비교하여)이 시나리오는 여전히 컴파일시 검사의 많은을 제공합니다.

    우리가 행의 관점에서 동적 <지도>를 사용하고 싶습니다 경우 시나리오에서는 위의 설명 - 우리는이 같은 테이블이 필요합니다 :

    ElemntId| TheKey       | TheValue (e.g. nvarchar)
    1       | "name"       | "Element A"
    1       | "time"       | "20:02"
    1       | "date"       | "2013-05-22"
    1       | "value"      | "11.22"
    

    C #은 다음과 같이 보일 것이다

    public class Elements
    {
        ...
        public virtual IDictionary<string, string> Values { get; set; }
    }
    

    매핑 :

    <map name="Values" table="DynamicElementValues" >
       <key column="ElementId"/>
        <index column="TheKey" type="string"/>
        <element column="TheValue" type="string"/>
    </map>
    

    우리가 IDictionary를 사용했기 때문에 <문자열, 문자열> 모든 값은 문자열입니다. 우리는 제대로 그 가치를 해석하는 일부 메타 데이터를 필요

    우리는 얻은 :

    우리는 손실 :

    이번에는 우리가 정말 열을 통해 동적 솔루션을하려고합니다.

    NHibernate에 기능, 우리는 여기에 사용할 수 있습니다 :

    매핑의이 종류는 우리의 요구 사항에 매우 가까운 질문이다. 우리는 C #을 표현을해야합니다

    public class Elements
    {
        ...
        public virtual IDictionary DynamicValues { get; set; }
    }
    

    그리고 이것은 매핑 될 수있다 :

    <join table="ElemntValues" >
    
      <key column="ElementId" />
      <dynamic-component name="DynamicValues"   >
    
        <property name="Time"        type="TimeSpan" />
        <property name="Date"        type="DateTime" />
        <property name="Salary"      type="decimal" />
        <property name="Color"       type="string" />
        <property name="WorkingDays" type="integer"  />
        <many-to one....
        ...
    
      </dynamic-component>
    </join>
    

    이 경우, 우리는 (그 <클래스> 매핑의 일환으로) 우리의 부모 개체에 조인 된 테이블의 ElementValues을 separted했다 않습니다.

    이것은 유일한 매핑되지 않습니다. 예를 들어, 다른 맵핑 유형이있을 수 있습니다 4.4. 동적 모델

    <class entity-name="DynamicValues"...
    

    다음은 좀 더 특별한 처리를 필요로 (삽입, 업데이트, 삭제)

    물건을 많이 단순화 것이다 가입하지만, 항상 SQL 문에 사용됩니다 (단 부모의 핵심 특성이 요구되는 경우에도)

    그것은 동적인가?

    그럼 우리가 얻은 :

    우리는 손실 :

    그럼,이 문서에 적혀있다? 7.5. 동적 구성 요소 :

    ...는 DOM 파서를 사용하여. 솔직히 말해서, 나는 평균 것을 어떻게 구현 해야할지 모르겠어.

    또한 아담 바에서 매핑별로 코드 - 동적 요소 (주석 참조) 언급

    NHibernate에의 동적 매핑 (일부 추출물 너무 복잡 살펴) - 그러나 FIRO에서 좋은 아이디어가있다. 정말 필요한 경우, 이것은 실제 역동적 인 세계에 솔루션 ... 런타임에 새 열 ... IDictionary에 매핑하는 새 키가 될 수

    은 <지도> 매핑을 우리는 매우 역동적이 될 수 있습니다. 런타임에서 다른 키와 값. 재배치 필요가 없습니다. 그러나 우리는하여 선택하거나 순서대로 동적 속성을 사용할 수 없습니다. 이들 값을 기준으로 필터 어렵다

    은 <동적 성분>로 우리는 (박스)의 개 맵핑에 의존한다. 그러나 우리는 할 컬럼에서 우리의 데이터를 따라서 우리가 사용할 수를 검색 할 수 합류했다. 쉬운 정렬, 필터링합니다. 그리고 /하지만 우리가 할 무엇을 우리가 무엇을 할 수 있는지 우리를 안내하는 몇 가지 메타 데이터가 있어야합니다.

  2. from https://stackoverflow.com/questions/16688102/nhibernate-dynamic-columns-number by cc-by-sa and MIT license