2

所以我有两个表(产品和供应商)通过多对多关系连接。它们的编码如下:

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; }
}

-

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; }
}

这就是我映射他们关系的方式:

<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>

现在,我在插入新产品并尝试将相应的供应商链接到它时遇到问题。我确实设法更新了一个已经存在的,但没有创建一个新的。这是我尝试使用的(简化的)代码:

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>'

任何帮助表示赞赏。

4

2 回答 2

3

采用...

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

您的列表需要在添加项目之前进行初始化。IList是接口,不是类,需要使用List,默认实现IList

顺便说一句,您似乎对 C# 语言或内置的 .NET 库不太熟悉。我建议在使用 Hibernate 等第三方库之前先熟悉基本的 C# 开发。Hibernate 是一个特别复杂的库,如果您在诊断这些简单的错误时遇到麻烦,这会让您感到头疼。

祝你好运!

更新:

抱歉,我没有注意到您的字段类型是ISet,不是IList。您将不得不使用像ISetSly在他们的回答中展示的那样的实现。HashSetSortedSet

您可以浏览 MSDN 以了解有关这些集合类型的更多信息...

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

于 2012-09-10T22:48:51.037 回答
2

采用

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

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

这样,您将确保始终初始化集合并且没有人可以替换它。

于 2012-09-11T07:11:16.103 回答