0

我有一个场景,其中一个用户实体有一个国家 ID 列表,作为 IList 保存。

public virtual IList<int> TradeCountries { get; protected set; }

目前这被映射为

HasMany(x => x.TradeCountries).Element("TradeCountryId").AsList(x => x.Column("TradeCountryIndex"));

结果表是这样定义的

create table TradeCountries (
    User_id INT not null,
   TradeCountryId INT null,
   TradeCountryIndex INT not null,
   primary key (User_id, TradeCountryIndex)
)

这一切都很好 - 但是我想让 TradeCountries 上的 PK 成为 User_id,TradeCountryId。使用 AsList() 映射时,我似乎找不到这样做的方法。有任何想法吗?

4

1 回答 1

3

Fluent NHibernate 中使用的集合的转换是这样进行的(如此处所述)

// <set>
public virtual ISet<Child> Children { get; set; }    
HasMany(x => x.Children); // <set />

// <bag>
public virtual IList<Child> Children { get; set; }    
HasMany(x => x.Children); // <bag />

// <list>
public virtual IList<Child> Children { get; set; }    
HasMany(x => x.Children).AsList(...; // <list />

这些映射的本质/区别在文档Understanding Collection performanceAyende的帖子中有详细描述<list>:)提取物

...while<set/>是唯一元素的无序集合,a<list/> 是元素的集合,其中顺序很重要,并且允许重复元素...

换句话说,在使用时,您必须在keyindex<list>列上保留 PK ,因为可能存在重复。

在您的情况下,仅<bag>映射(没有显式.AsList()调用)可能足够有效,您可以删除索引列,并将 PK 移动到元素(User_id,TradeCountryId)。

注意:C# IList 仍然允许有更多“相同”的元素,你应该在业务层检查它

于 2012-12-11T20:42:36.453 回答