Fluent Nhibernate 映射相关项目

发布于 2024-09-05 03:23:30 字数 645 浏览 2 评论 0原文

我正在尝试将两个项目联系起来。我有一个表,它只是一个 Id 字段,然后有 2 列用于关联项目 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)
)

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

I am trying to relate 2 items. I have a table that is simply an Id field, and then 2 columns for the Item Id's to relate. I want it to be a 2 way relationship - that is, if the items appear twice in the table, I only want one relationship connection back.

So, here's my item:

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

   public virtual string Name {get; set;}

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

The table for relating the items looks like this:

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

   CONSTRAINT PK_RelatedItems PRIMARY KEY CLUSTERED (RelatedItemId)
)

What is the best way to map this connection?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧伤慢歌 2024-09-12 03:23:30

您需要使用“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 集合上的级联删除选项。

You need to use a "HasMany" mapping. I think the following may work:

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

You can always use a convention for the Id field. And consider cascade delete options on the HasMany collection.

弱骨蛰伏 2024-09-12 03:23:30

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

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

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

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

I had to do it the hard way (read HACK).

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

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

Then in my class I have a read only collection called RelatedItems which joins the two lists and selects distinct items to return.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文