[英]NHibernate Many-to-Many Relation: Quering the properties of the joining table
[英]Nhibernate Multiple table have One to many relation to specific table
我有一个表,称为A。A具有字段-objId。
还有其他表称为B,C和D。它们具有A记录列表。 需要通过将A记录添加到表B,C和D之一的A记录列表中来创建记录。objId字段必须是B / C / D记录的PK(id)(谁拥有该列表)的A。
这意味着-objId是许多表的FK。 我从表B开始。但是在创建了B表之后,就创建了表A的字段objId。 现在桌子C和D会是什么? 他们无法在表中创建objId列。
代码是:
<id name="Id">
<generator class="guid" />
</id>
<bag name="As" cascade="All">
<key column="ObjId" />
<one-to-many class="A" />
</bag>
<class name="A">
<id name="Id">
<generator class="guid" />
</id>
<property name="ObjId" />
public class B
{
public virtual Guid Id { get; set; }
public virtual IList<A> As{ get; set; }
}
public class A
{
public virtual Guid Id { get; set; }
public virtual string ObjId { get; set; }
}
向B添加A记录:
this.Update(session =>
{
var bRecord = ....;
bRecord.As.Add(new ARecord {
...
});
session.Update(bRecord);
});
我需要如何创建正确的关联?
通常,有更多方法来处理这种情况-每个方法都需要进行一些调整/扩展。 也就是说,您仍然必须更改数据库结构
如果A的实例可以被B,C,D中的每个引用,则唯一的方法是引入外键列BObjectId,CObjectId,DObjectId。
如果A的实例可以由其中一个(B,C,D)独占使用,则需要新的列,我们称它为Discriminator
<class name="A">
<id name="Id" generator="guid" />
<property name="ObjId" />
<property name="Discriminator" />
</class>
现在,我们必须在C#代码中将值正确填写到Discriminator中。 如果将A分配给B,我们必须填写“ B”
var a = new A();
b.AddA(a);
实施应该是这样的。
public virtual void AddA(A a)
{
As.Add(a);
a.ObjectId = this.ID
a.Discriminator = 'B'
}
注意:在这种情况下,我们将ID分配给ObjectId
。 它是有效的,但前提是已经分配了ID。 如果对象B
是瞬态的且具有默认ID值,则它将不起作用。 在这种情况下,我们将需要创建一些解决方法。 例如Flush()B,然后分配引用...
因此,我们成功地将Discriminator值正确地管理/填写/插入到A实例/记录中。 现在我们也可以将其用于映射 。 B,C,D袋映射将非常相似:
<class name="A">
<bag name="As" cascade="All" batch-size="25"
where=" Discriminator = 'B' " >
<key column="ObjId" />
<one-to-many class="A" />
</bag>
where=" Discriminator = 'B' "
是NHibernate如何将过滤器注入我们的集合的好方法。 将相同的内容应用于C,D ...和...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.