Свободный Nhibernate ссылается на неправильное имя столбца при работе с указанной коллекцией - PullRequest
1 голос
/ 22 августа 2011

Я новичок в Fluent NHibernate и работаю с некоторыми относительно простыми ассоциациями объектов.У меня есть объект Фонда, в котором есть коллекция объектов Холдинга.Я написал все файлы объектов и карт явно, а не с помощью Automapper.При попытке получить коллекцию Holding для объекта фонда я получаю следующее исключение.Похоже, что NHibernate использует неправильное имя столбца для свойства _fundId, которое, как я полагаю, я явно указывал в ссылке на карте Holding.Я предполагаю, что упускаю некоторые мелкие детали, но я недостаточно знаком с 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'

Имя столбца идентификатора должно быть _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");
    }
}

Ответы [ 2 ]

2 голосов
/ 22 августа 2011

Это связано с принятыми по умолчанию соглашениями FK, которые свободно используются и ранее задавались в различных формах на SO. Смотрите, например:

И официальная вики о всех условностях:

Чтобы завершить, вы можете решить это также без соглашения (как упомянуто в связанных статьях), явно указав ключевой столбец в HasMany как:

HasMany(x => x._holdings ).KeyColumns.Add("_fundID")
0 голосов
/ 23 августа 2011

Укажите имя вашего ключа явно, как показано ниже:

HasMany(x => x._holdings ).KeyColumns.Add("_fundID")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...