1

尝试使用 FNH 进行映射并遇到很多问题,最终发现 FNH 缺少,并且不再维护,所以我决定尝试 Nhibernate MappingByCode,它到目前为止有效但没有文档......

我找不到如何映射 IDictionary

        Map(x => x.EntityDict,
            m =>
            {
                m.Key(k => k.Column("ParentID"));
            },
            km =>
            {
                km.//??ManyToMany
            vm =>
            {
                vm.//??ManyToMany
            }
            );

公里(键映射)中的选项是元素(值类型)/组件(同一个表中的内部对象)/多对多(在这种情况下我不太了解)

我尝试在两者中都使用 ManyToMany,因为这似乎是最合乎逻辑的事情,但它没有用。

保存字典时 SaveUpdate 已通过,但它没有保存到数据库中,并且无法取回字典。

编辑:这里是示例字典结构

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();
        }
4

1 回答 1

2

NHibernate 集合

每个 NHibernate 集合(bagsetmaplist等)都有一个key和 描述集合内容的东西。几个集合类型listmap也有一些描述集合索引的东西。

key是指向拥有该集合的实体的外键。

集合的内容将由以下元素之一描述:

  • one-to-many:集合的内容是某种实体,该实体的表用作集合的表。这意味着另一个实体可能many-to-one与这个实体有关系。您是否最终将这种关系包含在您的对象模型中是另一回事。
  • many-to-many:集合的内容是一个实体,但是集合使用了一个中间表,以便集合元素可以被其他集合重用。
  • element: 集合的内容是某种简单的值类型,例如int,string等。table应该为集合指定 A,因为这些值类型通常没有任何特定的表。
  • composite-element: 与 类似element,但这里将多个列映射到组件类中的属性。

最后,对于索引,您的选择是:

  • index: 索引是一个简单的值类型,比如intor string。这是lists 唯一可用的索引类型。在 a 上list,这些值直接对应于列表的索引值 、list[0]list[1],因此该列中的非顺序值将导致 .NET 集合中出现一些空值。 index已分别重命名为list-indexmap-keyfor lists 和maps。旧名称和新名称都应该有效。
  • index-many-to-many:索引是一个实体。 index-many-to-many已重命名为map-key-many-to-many. 旧名称和新名称都有效。

可能还有更多可用选项,但这些是最常用的选项。

你的字典

在您的情况下,Entity3有一个由Entity2s 索引的字典Entity1,并且使用单独的表来跟踪Entity2这个集合。这意味着我们需要 amap和 a map-key-many-to-many(因为索引是一个实体)和 a many-to-many(因为内容是一个实体,但我们使用的是单独的表)。在 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")));

......会做的伎俩。

上面的映射我还没有测试过,这是我第一次尝试通过代码映射,所以让我知道它是否有效。

于 2013-10-29T16:16:38.307 回答