C# 为多表实体保存时仅更新一个表

C# 为多表实体保存时仅更新一个表,c#,nhibernate,fluent-nhibernate,nhibernate-mapping,C#,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我有一个实体,它由我描述的两个不同表中的属性组成,当我尝试插入一个新项时遇到了问题。插入时,我只需要更新两个表中的一个表中的字段。使用ReadOnly()方法,我可以让NHibernate在保存时忽略[RegistrationField]中的大部分字段。但是,我无法让它不尝试为外键将新条目保存到[RegistrationField],即使该外键已经存在条目 我的类映射为: public class RegistrationFieldMap : ClassMap<RegistrationFi

我有一个实体,它由我描述的两个不同表中的属性组成,当我尝试插入一个新项时遇到了问题。插入时,我只需要更新两个表中的一个表中的字段。使用
ReadOnly()
方法,我可以让NHibernate在保存时忽略
[RegistrationField]
中的大部分字段。但是,我无法让它不尝试为外键将新条目保存到
[RegistrationField]
,即使该外键已经存在条目

我的类映射为:

public class RegistrationFieldMap : ClassMap<RegistrationField>
{
    public RegistrationFieldMap()
    {
        Table("AccountRegistrationField");

        Id(r => r.ID).Column("RegistrationID");
        Map(r => r.AccountID);
        Map(r => r.DefaultValue);
        Map(r => r.FieldID);
        Map(r => r.IsRequired);
        Map(r => r.Label);
        Map(r => r.Priority);
        Join("RegistrationField", t =>
        {
            t.Map(r => r.FieldType).ReadOnly();
            t.Map(r => r.HtmlID).ReadOnly();
        });
    }
}
我只需要它来运行第一条语句,因为
[RegistrationField]
表包含一个静态的值列表,不应该向其中添加新项


欢迎提出任何建议。

好的,在考虑了迭戈的评论并获得了良好的睡眠后,我找到了正确的方法来实现这一点,并得到了我想要的结果。迭戈说得对,我应该使用
Reference
,而不是
Join
。我希望将其实现为连接的最初理由是希望避免向对象图中添加另一个级别
AccountRegistrationField
已经是
Account
对象上的一个属性,我不想进行类似于
Account.AccountRegistrationField.RegistrationField.FieldType的调用。相反,我希望调用是
Account.AccountRegistrationField.FieldType
,因为我真正要操作的对象是
AccountRegistrationField
对象

通过更好地设计
AccountRegistrationField
类,我能够获得这种行为。我将
RegistrationField
属性设置为私有,并在
AccountRegistrationField
类中添加了公共属性,以公开我需要的字段。然后使用Fluent NHibernate的类将私有属性公开给我的映射

我的
AccountRegistrationField
课程最终看起来是这样的:

public class AccountRegistrationField
{
    public virtual int ID { get; set; }
    public virtual int AccountID { get; set; }
    public virtual string DefaultValue { get; set; }
    public virtual int FieldID { get; set; }
    public virtual string HtmlID 
    { 
        get { return RegistrationField.HtmlID; } 
    }
    public virtual bool IsRequired { get; set; }
    public virtual string Label { get; set; }
    public virtual int Priority { get; set; }
    public virtual string FieldType 
    { 
        get { return RegistrationField.FieldType; } 
    }

    private RegistrationField RegistrationField { get; set; }
}
我的
AccountRegistrationField
映射如下:

public class AccountRegistrationFieldMap : ClassMap<AccountRegistrationField>
{
    public AccountRegistrationFieldMap()
    {
        Table("AccountRegistrationField");

        Id(r => r.ID).Column("RegistrationID");
        Map(r => r.AccountID);
        Map(r => r.DefaultValue);
        Map(r => r.IsRequired);
        Map(r => r.Label);
        Map(r => r.Priority);
        References<RegistrationField>(
                 Reveal.Member<AccountRegistrationField>("RegistrationField"))
            .Column("FieldID");

    }
}
公共类AccountRegistrationFieldMap:ClassMap
{
公共帐户注册字段映射()
{
表(“AccountRegistrationField”);
Id(r=>r.Id).列(“注册Id”);
Map(r=>r.AccountID);
Map(r=>r.DefaultValue);
Map(r=>r.IsRequired);
Map(r=>r.Label);
Map(r=>r.Priority);
参考资料(
显示。成员(“注册字段”))
.列(“字段ID”);
}
}

Wait,如果RegistrationField是一个查找表,则您不需要使用
Join
。你描述这个问题的方式让我这么想,但你可能应该使用一个定期的参考。在这个问题上,我同意迭戈的观点。
public class AccountRegistrationFieldMap : ClassMap<AccountRegistrationField>
{
    public AccountRegistrationFieldMap()
    {
        Table("AccountRegistrationField");

        Id(r => r.ID).Column("RegistrationID");
        Map(r => r.AccountID);
        Map(r => r.DefaultValue);
        Map(r => r.IsRequired);
        Map(r => r.Label);
        Map(r => r.Priority);
        References<RegistrationField>(
                 Reveal.Member<AccountRegistrationField>("RegistrationField"))
            .Column("FieldID");

    }
}