nhibernate - 如何在 NHibernate 中使用 CompositeId 级联保存?

标签 nhibernate fluent-nhibernate mapping

我有一个简单的多对多关系的三表数据库。

A(id, Name)
B(id, Name)
AB(AId, BId) references A and B

对应的类:

public class A
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

public class B
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

public class AB
{
    public virtual A A { get; set; }
    public virtual B B { get; set; }
    public override bool Equals(object obj) { /* routine */ }
    public override int GetHashCode() { /* routine */ }
}

我已经用 Fluent NHibernate 做了映射:

public class AMap : ClassMap<A>
{
    public AMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.Name);
    }
}

public class BMap : ClassMap<B> { /* The same as for A */ }

public class ABMap : ClassMap<AB>
{
    public ABMap()
    {
        CompositeId()
            .KeyReference(x => x.A, "AId")
            .KeyReference(x => x.B, "BId");
    }
}

所以现在我希望能够做这样的事情

var a = new A { Name = "a1" };    
var b = new B { Name = "b1" };    
var ab = new AB { A = a, B = b };

//session.SaveOrUpdate(a);
//session.SaveOrUpdate(b);
session.SaveOrUpdate(ab);

但是在 SaveOrUpdate 上我得到了 TransientObjectException。因此,要传递它,我需要在保存 AB 之前SaveOrUpdate A 和 B。但似乎应该有其他方法将这些对象保存在单个 SaveOrUpdate 中。

有没有办法在保存操作时将 AB 映射到级联 A 和 B?

更新:

为了清楚起见,我删除了 A 类中的 AB 链接列表。原来是:

public class A
{
    public A()
    {
        LinkToB = new List<AB>();
    }

    public virtual int Id { get; set; }
    public virtual string Name { get; set }
    public virtual IList<AB> LinkToB { get; private set; }
}

public class AMap : ClassMap<A>
{
    public AMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.Name);

        HasMany(x => x.LinkToB)
            .KeyColumn("AId")
            .Inverse()
            .Cascade.All()
            .AsBag();
    }
}

// inside the transaction
var a = new A { Name = "a1" };
var b = new B { Name = "b1" };

a.LinkToB.Add(new AB { A = a, B = b });
// session.SaveOrUpdate(b);
session.SaveOrUpdate(a);

谢谢!

最佳答案

我确实在 nhibernate 用户组问过这个问题。答案是没有办法使用 composite-id 级联任何操作(也许在未来的版本中这将是可能的)。

所以我做了一个解决方法。我放置了两个引用(多对一的级联)而不是 CompositeId,并将 Id 添加到 AB 表和 AB 实体。现在它正在运行,A 和 B 实体正在级联。

关于nhibernate - 如何在 NHibernate 中使用 CompositeId 级联保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1420498/

相关文章:

ip - 为什么我的主机文件条目被浏览器忽略?

parsing - 使用 YAML.mapping 解析复杂的 YAML 结构

mysql - 流畅的多对多关系不起作用

c# - 流利的 Nhibernate : Configure Database in XML

nhibernate - 如果之前已使用 Get 检索过该实体,则无法合并具有复合 Id 的实体

fluent-nhibernate - 流利的 NHibernate : How to handle one-to-many values when the many is a simple enum

unit-testing - 单元测试流畅的 NHibernate。需要帮助理解测试期间发生的异常

java - Hibernate HashMap 映射

NHibernate:在读取过程中使用(var tx = session.BeginTransaction()){} 而不使用 Commit() 可以吗?

.NET ORM 需要虚拟,不能处理密封?