беглый nhibernate autop, выводящий неверный ключ - PullRequest
0 голосов
/ 30 августа 2010

У меня возникли проблемы с использованием CreateCriteria для добавления внешнего соединения к запросу критерия при использовании Fluent NHibernate с автоматическим сопоставлением.

Вот мои сущности -

public class Table1 : Entity
    {
        virtual public int tb1_id { get; set; }
        virtual public DateTime tb1_date_filed { get; set; }
    .
    .
    .
        virtual public IList<Table2> table2 { get; set; }
    }

public class Table2: Entity
    {
        public virtual int tb2_id { get; set; }
        public virtual int tb2_seqno { get; set; }
        .
        .
        .
        public virtual Table2 table2 { get; set; }
    }

Я пытаюсь использоватьследующие, чтобы добавить внешнее объединение в мой запрос критериев -

CreateCriteria("Table2", NHibernate.SqlCommand.JoinType.LeftOuterJoin);

Но я получаю ошибку -

{"EIX000: (-217) Column (tbl1_id) not found in any table in the query (or SLV is undefined)."}

Так что, похоже, он пытается автоматически установить идентификаторвторая таблица, но не знает, что ее установить.Есть ли способ, которым я могу специально установить идентификатор?Вот моя сессия -

var persistenceModel = AutoMap.AssemblyOf<Table1>()
                .Override<Table1>(c => {    
                    c.Table("case");
                    c.Id(x => x.id).Column("tbl1_id");
                })
                .Where(t => t.Namespace == "MyProject.Data.Entities")
                .IgnoreBase<Entity>();

Надеюсь, что это имеет смысл.Спасибо за любые мысли.

Ответы [ 2 ]

1 голос
/ 30 августа 2010

Вы, похоже, ответили на свой вопрос, поэтому я просто собираюсь высказать некоторые рекомендации ...

Одна из приятных особенностей беглого nhibernate заключается в том, что он следует соглашениям для автоматического создания отображений. Кажется, ваши сущности очень связаны с именами таблиц вашей базы данных.

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

public class CrazyLongBeardedDBATableNamingConvention
    : IClassConvention
{
    public void Apply(IClassInstance instance)
    {
        instance.Table("tbl_" + instance.EntityType.Name.ToLower());
    }
}

public class CrazyLongBeardedDBAPrimaryKeyNamingConvention
    : IIdConvention
{
    public void Apply(IIdentityInstance instance)
    {
        string tableShort = TableNameAbbreviator.Abbreviate(instance.EntityType.Name); 
        instance.Column(tableShort + "_id");
    }
}

class CrazyLongBeardedDBAColumnNamingConvention : IPropertyConvention
{
    public void Apply(IPropertyInstance instance)
    {
        string name = Regex.Replace(
            instance.Name,
            "([A-Z])",
            "_$1").ToLower();

        var tableShort = TableNameAbbreviator.Abbreviate(instance.EntityType.Name); 
        instance.Column(tableShort + name);
    }
}

TableNameAbbreviator - это класс, который знает, как сокращать имена таблиц.

Это будет карта от:

public class Table1 : Entity
{
    virtual public int Id { get; set; }
    virtual public DateTime DateFiled { get; set; }
}

К столу вроде:

CREATE TABLE tbl_table1 {
    tbl1_id INT PRIMARY KEY
    tbl1_date_filed datetime
}
0 голосов
/ 30 августа 2010

Я добавил опцию HasMany в переопределение для моей первой таблицы, чтобы определить отношение ко второй таблице. Затем я добавил переопределение для моей второй таблицы, которая определяет столбец id для этой таблицы.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...