где пункт в соединении отображения бегло nhibernate - PullRequest
1 голос
/ 04 ноября 2011

У меня есть следующее беглое отображение Nhiberhate, но я не могу понять, как вставить предложение where в одно из объединений.Я только хочу присоединиться к таблице операций, где OperationKind == "TASK".Есть идеи, как этого добиться?Без linq вне отображения.

sql, который я хочу, выглядел бы примерно так

Ответы [ 2 ]

1 голос
/ 20 апреля 2012

вопрос старый, но все равно.У меня была такая же проблема (устаревшая БД, не разрешалось менять схему).Если он находится в предложении where, nhibernate использует псевдоним первой таблицы, который выдает ошибку.

Мое решение состояло в том, чтобы определить представление для объединения, а затем использовать представление в качестве объединенной таблицы.Столбец, который не может быть указан в предложении where, также отображается (так что вставки также работают).В вашем случае представление может быть:

CREATE VIEW FilteredOperations
    SELECT OP.PHASE_S, OP.DESCRIPTION, OP.OPERATION_KIND
    FROM  GG.OPERATIONS OP
    WHERE OP.OPERATION_KIND = 'TASK';

My Fluent mappings:

public class Agency : EntityBase
    {
        public const string AgencyRoleId = "F1776564-1CA0-11d5-A70C-00A0120802D7";

        public Agency()
        {
            CountryId = "de";
            LanguageId = "de";
        }

        public virtual string AgencyId { get; set; }
        public virtual string Name { get; set; }
        public virtual string UserDefinedName { get; set; }
        public virtual string LanguageId { get; set; }
        public virtual string CountryId { get; set; }
        public virtual string RoleId
        {
            get
            {
                return AgencyRoleId;
            }
            set {}
        }
    }

public AgencyMap()
        {
            Table("mgmt_location_102");
            Id(x => x.AgencyId, "LocationId").GeneratedBy.UuidHex("D");
            Map(x => x.CountryId, "CountryId");
            Map(x => x.LanguageId, "LanguageId");
            Map(x => x.Name,"CommonName");

            Join("mgmt_agency_ext", x=>
                                        {
                                            x.Optional();
                                            x.KeyColumn("AgencyLocationId");
                                            x.Map(y => y.UserDefinedName, "AgencyUserDefinedName");

                                        });

            Join("scs2.vAgencyRoles", x =>
            {
                x.KeyColumn("LocationId");
                x.Map(y => y.RoleId, "RoleId").Not.Update();
            });
        }
1 голос
/ 04 ноября 2011

Join для простого объединения строк из нескольких таблиц в одну сущность. То, что вы пытаетесь достичь, немного сложнее - вы пытаетесь отфильтровать некоторые значения, а в SQL вы делаете это с помощью предложения where, а не join.

У вас есть два варианта - либо создать представление в базе данных и сопоставить вашу сущность с представлением (это делается точно так же, как для таблиц). Или второй вариант: дополнительная сторона кода должна добавить ограничение, соответствующее вашему предложению where на уровне отображения :

public MySectionMap()
{
    Schema("GG");
    Table("PROJ_PHASE_X");

    Join("PHASE", m => //...
    Join("OPERATIONS", //...

    Where("OPERATION_KIND = 'TASK'");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...