2012-09-10 2 views
2

그래서 다 대다 관계로 연결된 두 테이블 (제품 및 공급 업체)이 있습니다. 내가 그들의 관계를 매핑하는 방법C# Nhibernate - 다 대다 관계에 새 항목 추가

class Supplier 
{ 
    public virtual uint id { get; set; } 
    public virtual string name { get; set; } 
    public virtual string CNPJ { get; set; } 
    public virtual string addressLine1 { get; set; } 
    public virtual string addressLine2 { get; set; } 
    public virtual string telephone1 { get; set; } 
    public virtual string telephone2 { get; set; } 

    public virtual ISet products { get; set; } 
    public virtual ISet stockInlets { get; set; } 
} 

그리고 이것이 -

class Product 
{ 
    public virtual uint id { get; set; } 
    public virtual string name { get; set; } 
    public virtual float stock { get; set; } 
    public virtual float value { get; set; } 
    public virtual Category category { get; set; } 

    public virtual ISet suppliers { get; set; } 
    public virtual ISet saleItems { get; set; } 
    public virtual ISet stockInlets { get; set; } 
} 

을 : 그들은 다음과 같이 코딩하고

<set name="suppliers" table="product_x_supplier" fetch="join" lazy="false"> 
    <key column="product_id" /> 
    <many-to-many class="Supplier" column="supplier_id" /> 
</set> 

- 이제

<set name="products" table="product_x_supplier" fetch="join" lazy="false"> 
    <key column="supplier_id" /> 
    <many-to-many class="Product" column="product_id" /> 
</set> 

을, 나는 ' 새 제품을 넣고 시도 할 때 문제가 있습니다. o 특약 공급자를 연결한다. 나는 이미 존재하는 것을 갱신 할 수 있었지만 새로운 것을 생성하지는 않았다.

Product p = new Product() 
{ 
    name = "Test product", 
    stock = 0, 
    value = 2, 
    category = (Category)cats[0] 
}; 

for (int i = 0; i < suppliers.Length; i++) 
{ 
    p.suppliers.Add(suppliers[i]); 
} 

repository.Add(p); 

그것은 나를 Object reference not set to an instance of an object. 이야기 : 여기 내가 사용하려고 해요 (간체) 코드입니다. 나는 p.suppliers = new IList<Supplier>();과 같은 일을하지만 그 객체를 인스턴스화하려고 시도했지만 그때 그것을 Cannot create an instance of the abstract class or interface 'System.Collections.Generic.IList<TCC.Hibernate.Domain.Classes.Supplier>'이라고 불평했습니다.

도움을 주시면 감사하겠습니다.

답변

2

사용

class Supplier 
{ 
     public Supplier() 
     { 
      this.suppliers = new HashedSet<Supplier>(); 
     } 

     public virtual ICollection<Product> products { get; private set; } 
} 

당신이 컬렉션 항상 초기화되어 있는지 확인하고 누구도 대체 할 수없는이 방법 그것.

+1

몇 가지 문제가 있습니다 ... a) Supplier 클래스는 자체적으로 컬렉션이 필요하지 않으며 b) ISet 구현 클래스는 HashedSet이 아니라 HashSet입니다. 기본 생성자 내부에서 속성을 초기화하는 것이 올바른 방법입니다. +1! –

+0

고마워, 나는 전에 그걸 생각하지 않았던지 모르겠다. @ JesseWebb, HashedSet은 실제로 나를 위해 일했지만 HashSet은 그렇지 못했습니다. – rmobis

+0

'HashedSet' 클래스는 Spring.NET 클래스이고 (http://www.springframework.net/doc/sdk/2.0/html/Spring.Core~Spring.Collections.HashedSet.html),'HashSet' 클래스는 .NET 프레임 워크에 내장되어 있습니다 (http://msdn.microsoft.com/en-us/library/bb359438.aspx). 나는 당신이 참조 목록에 Spring을 가지고 있다면 두 가지 모두 작동 할 것이라고 생각한다. 나는 왜'HashSet'이 당신을 위해 작동하지 않았는 지 모르겠다. 아마도'using' 문을 누락했을 것이다. –

3

사용 ...

p.suppliers = new List<Supplier>(); 

귀하의 목록에 앞서 여기에 항목을 추가로 초기화 될 필요가있다. IList은 인터페이스가 아니며 클래스가 아니며 List을 사용해야하며 기본 구현은 IList입니다.

제쳐두고, C# 언어 나 기본 제공 .NET 라이브러리에 익숙하지 않은 것 같습니다. Hibernate와 같은 타사 라이브러리를 사용하기 전에 기본적인 C# 개발에 익숙해지는 것이 좋습니다. Hibernate는 이와 같은 간단한 에러조차도 문제를 진단하는 경우 많은 두통의 원인이되는 특히 복잡한 라이브러리입니다.

행운을 빈다.

UPDATE :

미안 해요, 난 당신의 필드 유형이 ISet하지 IList 있다고 통지를하지 않았다. Sly가 답을 통해 입증 한 것처럼 HashSet 또는 SortedSet과 같은 ISet 구현을 사용해야합니다. 당신이 수집 유형에 대한 자세한 내용은 MSDN을 찾아 볼 수 있습니다

...

http://msdn.microsoft.com/en-us/library/0sbxh9x2

+0

실제로''System.Collections.Generic.List '형식을'Iesi.Collections.ISet '형식으로 암시 적으로 변환 할 수 없습니다. 명시 적 변환이 존재합니다 (캐스트가 누락 되었습니까?). 그리고 캐스팅을 시도했을 때도 작동하지 않았습니다. 하지만 당신은 C#에 익숙하지 않았지만 최선을 다하고 있습니다. – rmobis

관련 문제