Почему обе стороны двунаправленного отношения «многие ко многим» не могут быть HashSets? - PullRequest
1 голос
/ 29 января 2011

У меня есть две сущности:

public class Product
{
    public virtual ICollection<Category> Categories { get; protected set; }

    public Product()
    {
        Categories = new HashSet<Category>();
    }
}

public class Category
{
    public virtual IEnumerable<Product> Products { get; protected set; }

    public Category()
    {
        Products = new HashSet<Product>();
    }
}

A Product может иметь много Categories, а Category может быть назначено многим Products. Хотя эти отношения могут быть представлены как однонаправленные «многие ко многим», я хотел иметь возможность удалить Category и сделать так, чтобы NHibernate автоматически удалял эту категорию из всех Products, что NHibernate не может сделать, если отношения только однонаправленные.

У меня есть два класса, сопоставленные следующим образом в Fluent NHibernate:

public class ProductMap : ClassMap<Product>
{
    HasManyToMany(x => x.Categories).AsSet();
}

public class CategoryMap : ClassMap<Category>
{
    HasManyToMany(x => x.Products).AsSet().Inverse();
}

Однако всякий раз, когда я пытаюсь сохранить новый Category, я получаю следующее исключение:

ArgumentNullException: коллекция не может быть нулевой. Имя параметра: c

Я точно определил проблему с типом коллекции Category.Products. Если я изменю его на List, он будет работать нормально, но если я сделаю его HashSet, он выдаст исключение. Почему обе стороны двунаправленного отношения не могут быть HashSet, и почему обратная сторона должна быть не HashSet? Я попытался сохранить Category.Products как HashSet, и я изменил Product.Categories на List, но я все еще получаю то же исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...