NHibernate MappingByCode mapping a IDictionary<Entity,Ent
本文关键字:Entity Ent lt MappingByCode mapping IDictionary NHibernate | 更新日期: 2023-09-27 18:37:19
尝试用FNH映射并遇到很多问题,最终发现FNH缺乏,并且不再维护,所以我决定尝试Nhibernate MappingByCode,到目前为止它可以工作,但没有文档...
我找不到如何映射 IDictionary
Map(x => x.EntityDict,
m =>
{
m.Key(k => k.Column("ParentID"));
},
km =>
{
km.//??ManyToMany
vm =>
{
vm.//??ManyToMany
}
);
km(键映射)中的选项是元素(值类型)/组件(同一表中的内部对象)/ManyToMany(在这种情况下我并不真正理解)
我尝试在两者中使用ManyToMany,因为它似乎是最合乎逻辑的事情,但它不起作用。
保存字典时,保存更新通过了,但它没有直接保存到数据库,并且无法取回字典。
编辑:这是示例字典结构
public class Entity1Map : ClassMapping<Entity1>
{
public Entity1Map()
{
Id(x=> x.ID,m=>m.Generator(Generators.Guid));
}
}
public class Entity2Map : ClassMapping<Entity2>
{
public Entity2Map()
{
Id(x=> x.ID,m=>m.Generator(Generators.Guid));
}
}
public class Entity3 { public IDictionary<Entity1,Entity2> Dict { get;set; } }
public class Entity3Map : ClassMapping<Entity3>
{
public Entity3Map()
{
Id(x=> x.ID,m=>m.Generator(Generators.Guid));
//Map Dict??
}
}
至于表结构——
Entity1 Table : ID Column
Entity2 Table : ID Column
Entity3 Table : ID Column
Dict Table : Entity3_ID,Entity1_ID,Entity2_ID
如果从数据库保存并重新创建此表结构,则不必是此表结构
@Daniel - 这是 HBM
<map name="Targets" table="Dict">
<key column="Entity3ID" />
<map-key-many-to-many class="Entity1" column="Entity1ID" />
<many-to-many class="Entity2" column="Entity2ID" />
</map>
编辑3(我认为):
var entity3 = new Entity3();
var entity1 = new Entity1();
var entity2= new Entity2();
entity3.Dict[entity1] = entity2;
using (var session = GetSession())
{
session.SaveOrUpdate(entity1);
session.SaveOrUpdate(entity2);
session.SaveOrUpdate(entity3 );
session.Flush();
}
NHibernate Collections
每个NHibernate集合(bag
,set
,map
,list
等)都有一个key
和描述集合内容的东西。 list
和map
几个集合类型也具有描述集合索引的内容。
key
是指向拥有集合的实体的外键。
集合的内容将由以下元素之一描述:
-
one-to-many
:集合的内容是某种实体,该实体的表用作集合的表。 这意味着另一个实体可能与此实体有many-to-one
关系。 最终是否实际将该关系包含在对象模型中是另一回事。 -
many-to-many
:集合的内容是一个实体,但集合使用中间表,以便集合元素可以被其他集合重用。 -
element
:集合的内容是某种简单的值类型,如int
、string
等。 应为集合指定table
,因为这些值类型通常没有任何特定的表。 -
composite-element
: 与element
类似,但此处多个列映射到组件类中的属性。
最后,对于索引,您可以选择:
-
index
:索引是一个简单的值类型,如int
或string
。 这是可用于list
的唯一索引类型。 在list
上,这些值直接对应于列表的索引值、list[0]
、list[1]
等,因此此列中的非连续值将导致 .NET 集合中的一些空值。index
已分别更名为list-index
和map-key
,分别为list
和map
。 旧名称和新名称都应该有效。 -
index-many-to-many
:索引是一个实体。index-many-to-many
已更名为map-key-many-to-many
。 旧名称和新名称都有效。
可能还有更多选项可用,但这些是最常用的选项。
您的字典
在您的情况下,Entity3
有一个按Entity1
索引的 Entity2
字典,并使用单独的表来跟踪Entity2
和此集合。 这意味着我们需要一个带有map-key-many-to-many
(因为索引是一个实体)和一个many-to-many
(因为内容是一个实体,但我们使用的是单独的表)的map
。 在 HBM XML 中,这看起来像:
<map name="Dict" table="Dict">
<key column="Entity3_ID" />
<map-key-many-to-many class="Entity1" column="Entity1_ID" />
<many-to-many class="Entity2" column="Entity2_ID" />
</map>
您可以在 FluentNHibernate 中使用 AsEntityMap
方法执行此操作:
HasManyToMany(x => x.Dict)
.Table("Dict")
.ParentKeyColumn("Entity3_ID")
.AsEntityMap("Entity1_ID", "Entity2_ID");
通过代码映射,我会想象这样的事情......
Map(x => x.Dict,
c =>
{
c.Table("Dict");
c.Key(k => k.Column("Entity3_ID"));
},
i => i.ManyToMany(m => m.Column("Entity1_ID")),
v => v.ManyToMany(m => m.Column("Entity2_ID")));
。会做这个伎俩。
我还没有测试过上面的映射,这是我第一次尝试通过代码映射,所以让我知道它是否有效。