[英]Specifying the Primary Key when using Fluent NHibernate and AsList()
我有一个场景,其中一个用户实体有一个国家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()映射时,我似乎找不到执行此操作的方法。 有任何想法吗?
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 />
这些映射的本质/区别在文档了解集合性能和Ayende的文章<list>
)中有详细描述。 提取物 :
...
<set/>
是无序集合,包含唯一元素,而<list/>
是元素的集合,其中顺序很重要,并且允许重复的元素...
换句话说,使用<list>
,必须在键和索引列上保留PK,因为可能存在重复项。
在您的情况下,仅<bag>
映射(没有显式的.AsList()
调用)可能足够有效,您可以删除索引列,然后将PK移至键和元素 (User_id,TradeCountryId)。
注意:C#IList仍然允许具有更多“相同”元素,您应该在业务层进行检查
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.