所以我有两个表(产品和供应商)通过多对多关系连接。它们的编码如下:
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>'
。
感谢任何帮助。
答案 0 :(得分:3)
使用...
p.suppliers = new List<Supplier>();
您需要在向其添加项目之前初始化您的列表。 IList
是一个界面,而不是一个类,您需要使用List
,IList
的默认实现。
顺便说一下,您可能不熟悉C#语言或内置的.NET库。我建议在使用像Hibernate这样的第三方库之前,先熟悉基本的C#开发。 Hibernate是一个特别复杂的库,如果您在诊断甚至像这样的简单错误时遇到麻烦,它将会引起许多麻烦。
祝你好运!<强>更新强>
抱歉,我没有注意到您的字段类型为ISet
,而不是IList
。您必须使用像ISet
或HashSet
这样的SortedSet
实施,正如Sly在答案中所证明的那样。
您可以浏览MSDN以了解有关这些集合类型的更多信息......
答案 1 :(得分:2)
使用
class Supplier
{
public Supplier()
{
this.suppliers = new HashedSet<Supplier>();
}
public virtual ICollection<Product> products { get; private set; }
}
这样,您将确保始终初始化集合,并且没有人可以替换它。