繁体   English   中英

使用Fluent NHibernate和AsList()时指定主键

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM