NHibernate重新创建每个关联的项目

Dav*_*ita 4 .net c# nhibernate fluent-nhibernate fluent-nhibernate-mapping

我有一个非常简单的对象模型.

public class Contact
{
    public virtual int Id                { get; set; }
    public virtual string Name           { get; set; }
    public virtual Device Device         { get; set; }
    public virtual IList<string> Numbers { get; set; }

    public Contact()
    {
        Numbers = new System.Collections.Generic.List<string>(3);
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,Contact类与Numbers有关联,Numbers是一个字符串列表.

这是映射:

        Id(x => x.Id).GeneratedBy.Assigned();
        Map(x => x.Name);
        References(x => x.Device, "DeviceId");
        Table("Contacts");
        HasMany(x => x.Numbers)
            .Table("ContactNumbers")
            .Element("Number")
            .KeyColumn("ContactId")
            .LazyLoad()
            .Cascade.All()
            .Not
            .Inverse();
Run Code Online (Sandbox Code Playgroud)

请注意,我不能也不希望该集合是inverse = true,因为它只是字符串的集合.这意味着Contact负责更新Numbers条目.现在我的问题是,每当我尝试向现有联系人添加新号码时,它会删除所有相关联的号码并单独重新创建.NHibernate不够智能,无法检测更改并仅更新已更改的项目吗?

我认为我的问题应该有一个简单的解决方案,但不知道是什么.

任何帮助,将不胜感激.

Mir*_*vic 7

这实际上记录在NHibernate的文档中.

手袋是最糟糕的情况.由于包允许重复的元素值并且没有索引列,因此不能定义主键.NHibernate无法区分重复的行.NHibernate通过完全删除(在单个DELETE中)并在每次更改时重新创建集合来解决此问题.这可能效率很低.

请尝试使用<idbag>映射,并为该表创建代理主键.不幸的是,看起来就像<idbag>还不支持FluentNHibernate.

另外,看看其他集合映射选项.