View 映射到自定义字段名上的视图-一对一关系

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

我无法让NHibernate在这种一对一关系中映射
受益人
账户
列的
账户
列(每个
账户
都有一个
受益人
,每个
受益人
都有一个
账户

课程:

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”无效。

以及:

覆盖所有my
IReferenceConvention
覆盖(将某些类映射为具有
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");
    }
}