【问题标题】:Fluent Nhibernate mapping related itemsFluent Nhibernate 映射相关项
【发布时间】:2011-03-02 18:14:29
【问题描述】:

我正在尝试关联 2 个项目。我有一个表,它只是一个 Id 字段,然后是 2 列用于关联的 Item Id。我希望它是一种双向关系 - 也就是说,如果项目在表中出现两次,我只想要一个关系连接。

所以,这是我的项目:

public class Item
{
   public virtual Guid ItemId {get; set;}

   public virtual string Name {get; set;}

   public virtual IList<Item> RelatedItems {get; set;}
}

关联项目的表格如下所示:

CREATE TABLE RelatedItems
(
   RelatedItemId   uniqueidentifier   DEFAULT(NEWID()) NOT NULL,
   ItemId          uniqueidentifier   NOT NULL,
   RelatedId       uniqueidentifier   NOT NULL,

   CONSTRAINT PK_RelatedItems PRIMARY KEY CLUSTERED (RelatedItemId)
)

映射此连接的最佳方式是什么?

【问题讨论】:

    标签: c# fluent-nhibernate mapping


    【解决方案1】:

    您需要使用“HasMany”映射。我认为以下可能有效:

    public class Item : ClassMap<Item>
    {
      Id(x=>x.Id)
        .Column("ItemId");
    
      Map(x=>x.Name);
    
      HasMany(x=>x.RelatedItems)
        .KeyColumn("RelatedId")
        .Table("RelatedItems")
        .LazyLoad()
        .AsList();    
    }
    

    您始终可以对 Id 字段使用约定。并考虑 HasMany 集合上的级联删除选项。

    【讨论】:

    • 问题是这种关系只能以一种方式起作用。我需要它双向工作。
    【解决方案2】:

    我不得不以艰难的方式做到这一点(阅读 HACK)。

    HasManyToMany(x => x.RelatedTo)
                    .Table("RelatedItems")
                    .ParentKeyColumn("ItemId")
                    .ChildKeyColumn("RelatedItemId");
    
    HasManyToMany(x => x.RelatedToMe)
                    .Table("RelatedItems")
                    .ChildKeyColumn("ItemId")
                    .ParentKeyColumn("RelatedItemId");
    

    然后在我的班级中,我有一个名为 RelatedItems 的只读集合,它连接两个列表并选择要返回的不同项目。

    【讨论】:

      猜你喜欢
      • 2011-04-10
      • 1970-01-01
      • 2011-06-18
      • 2012-04-03
      • 2012-10-19
      • 2013-01-07
      • 2013-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多