Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在NHibernate中创建父对象并同时向其添加子对象?_C#_Nhibernate - Fatal编程技术网

C# 如何在NHibernate中创建父对象并同时向其添加子对象?

C# 如何在NHibernate中创建父对象并同时向其添加子对象?,c#,nhibernate,C#,Nhibernate,当我试图创建一个集合并同时向其中添加一个类别时,我总是得到一个空引用。我忘了什么吗?还是我做错了 private static void SamepleMethod(ICollectionRepository collectionRepo) { Collection collection = new Collection { CollectionName = "Collection" }; Category category = new Category

当我试图创建一个集合并同时向其中添加一个类别时,我总是得到一个空引用。我忘了什么吗?还是我做错了

private static void SamepleMethod(ICollectionRepository collectionRepo)
    {
        Collection collection = new Collection { CollectionName = "Collection" };

        Category category = new Category { Collection = collection, CategoryName = "Category" };

        category.SetCollection(collection);
        collection.AddCategory(category);

        collectionRepo.Save(collection);
    }
收藏:

public class Collection
{
    public virtual int? Id { get; set; }
    public virtual string CollectionName { get; set; }
    public virtual ICollection<Category> Categories { get; set; }

    public virtual void AddCategory(Category category)
    {
        Categories.Add(category);
        category.Collection = this;
    }
}
Collection.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               namespace="ACME.Model"
               assembly="ACME.Model">

<class name="Collection" table="Collections" >

<id name="Id" column="CollectionId" type="int" >
  <generator class="identity" />
</id>

<set name="Categories" inverse="true" cascade="all">
  <key column="CollectionId" />
  <one-to-many class="Category"></one-to-many>
</set>

<property name="CollectionName">
  <column name="CollectionName" sql-type="nvarchar(50)" />
</property>

Category.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               namespace="ACME.Model"
               assembly="ACME.Model">

<class name="Category" table="Categories" >

<id name="Id" column="CategoryId" type="int" >
  <generator class="identity" />
</id>

<many-to-one name="Collection"
             class="Collection"
             column="CollectionId"
             not-null="true" />

<property name="CategoryName">
  <column name="CategoryName" sql-type="nvarchar(50)" />
</property>


您从未初始化
集合
类中的
类别
属性,因此它保持默认值null…
您可能希望将其初始化为构造函数中的新集合

此外,我还计算了至少3个不同的代码行,其中您将类别与集合相关联。
我相信一次就足够了:)(我最喜欢的是
AddCategory
方法,或者
Category
方法)

另一件小事——hbm映射文件已经成为过去;如今,在代码中映射要方便得多(也不容易出错)。
您可以使用旧的扩展,也可以使用新的官方版本,这也很好,但遗憾的是,缺少文档

(正如Sjonny指出的):确保初始化Categories集合

除此之外,我还看到了代码中的其他问题(与您的问题无关):

仅初始化两个引用(从集合到类别,反之亦然)一次

您的代码执行以下操作:

 // set category.Collection
 Category category = new Category { Collection = collection ...
 // set collection agin
 category.SetCollection(collection);
     // within SetCollection, you add the category
     collection.Categories.Add(this);
 // and add the category agin
 collection.AddCategory(category);
看起来该类别可以放在多个集合上,这些集合可以有多个类别。如果是这种情况,您应该将它们映射为
多对多
。如果它真的是正确的,不要介意

除非您正在做一些特殊的事情,否则不应该使用sql类型。只需映射如下所示的字符串:

<property name="CategoryName" column="CategoryName" length="50" />

不鼓励使用标识主键,因为它会给您带来糟糕的性能

<property name="CategoryName" column="CategoryName" length="50" />