首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate MappingByCode映射IDictionary<Entity,Entity>

NHibernate MappingByCode映射IDictionary<Entity,Entity>
EN

Stack Overflow用户
提问于 2013-10-29 08:10:44
回答 1查看 1.3K关注 0票数 1

尝试用FNH映射它,并遇到了许多问题,最终发现FNH缺乏,不再维护,所以我决定尝试Nhibernate MappingByCode,它目前还在工作,但是没有文档.

我找不到如何映射IDictionary

代码语言:javascript
复制
        Map(x => x.EntityDict,
            m =>
            {
                m.Key(k => k.Column("ParentID"));
            },
            km =>
            {
                km.//??ManyToMany
            vm =>
            {
                vm.//??ManyToMany
            }
            );

km(键映射)中的选项是元素(值类型)/组件(同一表中的内部对象)/ ManyToMany (在这个上下文中我并不真正理解)。

我试图在这两种情况下都使用ManyToMany,因为这似乎是最符合逻辑的事情,但它没有起作用。

当保存字典时,SaveUpdate通过了,但它没有将其保存到DB,也无法将字典取回。

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

代码语言:javascript
复制
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??
    }
}

至于餐桌结构方面-

代码语言:javascript
复制
Entity1 Table : ID Column
Entity2 Table : ID Column
Entity3 Table : ID Column
Dict Table : Entity3_ID,Entity1_ID,Entity2_ID

如果在另一个表中从DB中保存和重新创建表结构,则不一定是此表结构。

@Daniel -这是hbm

代码语言:javascript
复制
<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(我认为):

代码语言:javascript
复制
        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();
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-29 16:16:38

NHibernate收藏

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

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

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

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

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

  • index:索引是一个简单的值类型,如intstring。这是list的唯一可用索引类型。在list上,这些值直接对应于列表的索引值、list[0]list[1]等,因此本列中的非顺序值将导致.NET集合中的一些空值。index已被分别重命名为list-indexmap-key,分别用于listmap。旧名字和新名字都应该起作用。
  • index-many-to-many:索引是一个实体。index-many-to-many已改名为map-key-many-to-many。新旧名字都起作用。

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

你的字典

在您的示例中,Entity3有一个由Entity1索引的Entity2字典,并且使用单独的表来跟踪Entity2和这个集合。这意味着我们需要一个带有mapmap-key-many-to-many (因为索引是一个实体)和一个many-to-many (因为内容是一个实体,但是我们使用的是一个单独的表)。在HBM中,这类似于:

代码语言:javascript
复制
<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方法执行此操作:

代码语言:javascript
复制
HasManyToMany(x => x.Dict)
    .Table("Dict")
    .ParentKeyColumn("Entity3_ID")
    .AsEntityMap("Entity1_ID", "Entity2_ID");

通过代码映射,我可以想象像这样的东西.

代码语言:javascript
复制
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")));

..。会起作用的。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19652839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档