View 映射到自定义字段名上的视图-一对一关系
我无法让NHibernate在这种一对一关系中映射View 映射到自定义字段名上的视图-一对一关系,view,fluent-nhibernate,sql-server-2000,View,Fluent Nhibernate,Sql Server 2000,我无法让NHibernate在这种一对一关系中映射受益人表账户列的账户列(每个账户都有一个受益人,每个受益人都有一个账户) 课程: public class Account { ... public virtual string Name { get; protected set; } public virtual string Code { get; protected set; } } public class Beneficiary { ... p
受益人
表账户
列的账户
列(每个账户
都有一个受益人
,每个受益人
都有一个账户
)
课程:
public class Account
{
...
public virtual string Name { get; protected set; }
public virtual string Code { get; protected set; }
}
public class Beneficiary
{
...
public virtual int Id { get; set; }
public virtual string Name { get; protected set; }
public virtual Account Account { get; protected set; }
public virtual BeneficiaryGroup Group { get; protected set; }
}
SQL:
当尝试使用有许多
和不同的变体时,NHibernate会尝试加入受益人.Id
列
我尝试了不同的映射
,引用
,连接
(这告诉我连接已经存在)和有许多
(失败了,因为关系确实是一对一)
如何让NHibernate将这两个类正确映射到它们的列
在我的
IAutoMappingOverride
中尝试不同的fluent映射时,会发生以下情况:
mapping.HasOne(b => b.Account);
mapping.HasOne(b => b.Account).PropertyRef(sa => sa.Code);
mapping.HasOne(b => b.Account).PropertyRef(sa => sa.Code).ForeignKey("none");
生成的SQL使用受益人.Id
字段,而不是受益人.AccountCode
。(在您提问之前,我使用的是“无”,因为Account
是一个视图,它不能有键)
结果在已添加的情况下尝试将联接添加到表“Account”。
以及:
结果:
无法确定以下列的类型:。帐户,版本=1.0.0.0,区域性=中性,PublicKeyToken=null:
NHibernate.Mapping.Column(AccountCode)
导致列名“code”无效。
以及:
覆盖所有myIReferenceConvention
覆盖(将某些类映射为具有code
键列)
尝试时有许多:
mapping.HasMany<Account>(b => b.Account).KeyColumn("AccountCode");
mapping.HasMany(b=>b.Account).KeyColumn(“AccountCode”);
自定义类型未实现UserCollectionType:。帐户
这种方法与Firo的类似,但映射更简单。它像他建议的那样使用引用
,因为NH允许您选择实体主键属性以外的属性来引用其他类型。PropertyRef
不是必需的,因为NH“知道”它将使用AccountCode
值作为Account
视图中的“键”
下面是如何映射帐户:
public class AccountMap : ClassMap<Account>
{
public AccountMap()
{
// Code as a psuedo primary key in the view:
Id(acc => acc.Code)
.GeneratedBy.Assigned();
Map(acc => acc.Name);
// Add other mappings here...
// Ensure NH doesn't try to update the lookup view:
ReadOnly();
}
}
版本,如重要:NHibernate 3.3.1.4000,FluentNHibernate 1.3.0.733。
mapping.Map(b => b.Account, "AccountCode");
mapping.Map(b => b.Account).ReadOnly().Column("AccountCode");
mapping.References(b => b.Account).Column("Code");
mapping.References(b => b.Account).Column("AccountCode");
mapping.References(b => b.Account).Column("AccountCode").Access.Property();
mapping.HasMany<Account>(b => b.Account).KeyColumn("AccountCode");
// in BeneficiaryMapping
mapping.References(b => b.Account)
.Column("AccountCode" /* of Beneficiary table*/)
.PropertyRef(a => a.Code); // use the Column of Code as the joincolumn in Account table
public class AccountMap : ClassMap<Account>
{
public AccountMap()
{
// Code as a psuedo primary key in the view:
Id(acc => acc.Code)
.GeneratedBy.Assigned();
Map(acc => acc.Name);
// Add other mappings here...
// Ensure NH doesn't try to update the lookup view:
ReadOnly();
}
}
public class BeneficiaryMap : ClassMap<Beneficiary>
{
public BeneficiaryMap()
{
Id(b => b.Id)
.GeneratedBy.Identity()
.UnsavedValue(0);
Map(b => b.Name);
// Other mapped properties...
References<BeneficiaryGroup>(b => b.Group, "BeneficiaryGroupId");
References<Account>(b => b.Account, "AccountCode");
}
}