Fluent Nhibernate 在使用引用的集合时引用了不正确的列名

Posted

技术标签:

【中文标题】Fluent Nhibernate 在使用引用的集合时引用了不正确的列名【英文标题】:Fluent Nhibernate referencing incorrect column name when working with a referenced collection 【发布时间】:2011-08-21 22:57:27 【问题描述】:

我是 Fluent NHibernate 的新手,并且正在使用一些相对简单的对象关联。我有一个 Fund 对象,它有一个 Holding 对象的成员集合。我自己明确编写了所有对象和映射文件,而不是使用 Automapper。尝试检索基金对象的 Holding 集合时,出现以下异常。似乎 NHibernate 为持有 _fundId 属性使用了不正确的列名,我相信我已经在持有地图的引用中明确设置了该属性。我假设我遗漏了一些小细节,但我对 FNH 的诊断不够熟悉。感谢您的帮助。

NHibernate.Exceptions.GenericADOException : could not initialize a collection: [ThirteenFeed.Entities.Fund._holdings#1][SQL: SELECT holdings0_.Fund_id as Fund9_1_, holdings0_._holdingID as column1_1_, holdings0_._holdingID as column1_4_0_, holdings0_._filingDate as column2_4_0_, holdings0_._principleAmt as column3_4_0_, holdings0_._shares as column4_4_0_, holdings0_._value as column5_4_0_, holdings0_._fundID as column6_4_0_, holdings0_._assetID as column7_4_0_, holdings0_._assetClassID as column8_4_0_ FROM `Holding` holdings0_ WHERE holdings0_.Fund_id=?]----> mysql.Data.MySqlClient.MySqlException : Unknown column 'holdings0_.Fund_id' in 'field list'

id 列名称应为_fundId 请参阅下面的对象和地图。

public class Fund

    public virtual int _fundID get; protected set;
    public virtual string _cik get; set;
    public virtual string _fundName get; set;
    public virtual IList<Holding> _holdings get; protected set;

    public Fund()
    
        _holdings = new List<Holding>();
    

    public virtual void AddHolding(Holding holding)
    
        _holdings.Add(holding);
        holding._fund = this;
    


public class Holding

    public virtual int _holdingID get; protected set;
    public virtual DateTime _filingDate get; set;
    public virtual int _timePeriod get; set;
    public virtual Fund _fund get; set;
    public virtual Asset _asset get; set;
    public virtual AssetClass _assetClass get; set;
    public virtual int _value get; set;
    public virtual int _shares get; set;
    public virtual int _principleAmt get; set;

    public virtual void SetAssetClass(AssetClass assetClass)
    
        this._assetClass = assetClass;
    

    public virtual void SetAsset(Asset asset)
    
        this._asset = asset;
    


public class FundMap : ClassMap<Fund>

    public FundMap() 
    
        Id(x => x._fundID).GeneratedBy.Identity();
        Map(x => x._cik);
        Map(x => x._fundName);
        //TODO: get correct handling of HasMany relationships.
        HasMany(x => x._holdings)
            .Inverse()
            .Cascade.Delete();
    


public class HoldingMap : ClassMap<Holding>

    public HoldingMap()
    
        Id(x => x._holdingID).GeneratedBy.Identity();
        Map(x => x._filingDate);
        Map(x => x._principleAmt);
        Map(x => x._shares);
        Map(x => x._value);
        References(x => x._fund)
            .Column("_fundID");
        References(x => x._asset)
            .Column("_assetID");
        References(x => x._assetClass)
            .Column("_assetClassID");
    

【问题讨论】:

【参考方案1】:

这与 fluent 之前在 SO 上以不同形式询问过的默认 FK 约定有关。例如:

Fluent NHibernate HasMany Foreign Key Mapping Problem Can I make a Fluent NHibernate foreign key convention which includes parent key name?

还有关于所有约定的官方 wiki:

http://wiki.fluentnhibernate.org/Available_conventions

为了完整起见,您也可以在没有约定的情况下解决它(如链接文章中所述),方法是自己在 HasMany 中明确指定键列,例如:

HasMany(x => x._holdings ).KeyColumns.Add("_fundID")

【讨论】:

谢谢,我检查了答案,但我正在寻找主键约定而不是外键,感谢您的帮助。【参考方案2】:

如下所示明确提及您的密钥名称:

HasMany(x => x._holdings ).KeyColumns.Add("_fundID")

【讨论】:

以上是关于Fluent Nhibernate 在使用引用的集合时引用了不正确的列名的主要内容,如果未能解决你的问题,请参考以下文章

使用 Fluent NHibernate AutoMapping 进行级联保存

Fluent Nhibernate 数据库配置

如何在 Fluent NHibernate 中将一对一关系映射为复合键的一部分

如何使用 Fluent 设置 NHibernate.Burrow?

使用 Fluent NHibernate 和 NHibernate 3 将枚举映射为 Int

在使用fluent-nhibernate配置nhibernate时,为什么会出现MissingMethodException?