IndexAttribute
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 31.08.09 07:50
Оценка:
Чего-то непонимаю про subj

Есть табличка:

CREATE TABLE [dbo].[BindingToDump](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [PLACE_ID] [int] NOT NULL,
    [PARAM_NAME] [nvarchar](50) NOT NULL,
    [PARAM_ADDR] [nvarchar](5) NOT NULL,
    [PARAM_TYPE] [int] NOT NULL,
    [PARAM_DESC] [ntext] NOT NULL,
...
CREATE UNIQUE NONCLUSTERED INDEX [BindingToDumpIdName_ndx] ON [dbo].[BindingToDump] 
(
    [PLACE_ID] ASC,
    [PARAM_NAME] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]

далее объект, представляющий одну запись:

    [TableName("BindingToDump")]
    public class ParamBinding : EntityBase
    {
        [MapField("ID")]
        public int Id { get; set; }
        [MapField("PLACE_ID")]
        public int PlaceId { get; set; }
        [MapField("PARAM_NAME")]
        public string ParamName { get; set; }
        [MapField("PARAM_ADDR")]
        public string ParamAddr { get; set; }
        [MapField("PARAM_TYPE")]
        public int ParamType { get; set; }
        [MapField("PARAM_DESC")]
        public string ParamDesc { get; set; }
    }

и Accessor:

    public abstract class ParamBindingAccessor : DataAccessor<ParamBinding>
    {
        [SqlQuery("SELECT * FROM BindingToDump WHERE PLACE_ID = @placeid ORDER BY PLACE_ID, PARAM_NAME")]
        public abstract List<ParamBinding> GetList( int placeid );

        [SqlQuery("SELECT * FROM BindingToDump WHERE PLACE_ID = @placeid ORDER BY PLACE_ID, PARAM_NAME")]
        [Index("PARAM_NAME")]
        public abstract Dictionary<string, ParamBinding> GetDict(int placeid);
    }


Вопрос — почему GetDict() кидает исключение "BLToolkit.Mapping.MappingException: Field 'PARAM_NAME' not found." (при том что GetList() работает как ожидается)? Ну и можно ли вообще получить то что я хочу...
Re: IndexAttribute
От: Clerk  
Дата: 31.08.09 08:41
Оценка: 45 (1)
Здравствуйте, Odi$$ey, Вы писали:

Судя по файлу ActualTypeAttributeTest.cs строка 58 писать нужно
[Index("@PARAM_NAME")]
... << RSDN@Home 1.2.0 alpha 4 rev. 1238>>
Re: IndexAttribute
От: ili Россия  
Дата: 31.08.09 09:18
Оценка: 23 (2)
Здравствуйте, Odi$$ey, Вы писали:

OE>
OE>    [TableName("BindingToDump")]
OE>    public class ParamBinding : EntityBase
OE>    {
// часть пропущена
OE>        [MapField("PARAM_NAME")]
OE>        public string ParamName { get; set; }
// часть пропущена
OE>    }

OE>

OE>и Accessor:

OE>
OE>    public abstract class ParamBindingAccessor : DataAccessor<ParamBinding>
OE>    {
OE>        [SqlQuery("SELECT * FROM BindingToDump WHERE PLACE_ID = @placeid ORDER BY PLACE_ID, PARAM_NAME")]
OE>        public abstract List<ParamBinding> GetList( int placeid );

OE>        [SqlQuery("SELECT * FROM BindingToDump WHERE PLACE_ID = @placeid ORDER BY PLACE_ID, PARAM_NAME")]
OE>        [Index("@PARAM_NAME")]
OE>        public abstract Dictionary<string, ParamBinding> GetDict(int placeid);

OE>        // или так
OE>        [SqlQuery("SELECT * FROM BindingToDump WHERE PLACE_ID = @placeid ORDER BY PLACE_ID, PARAM_NAME")]
OE>        [Index("ParamName")]
OE>        public abstract Dictionary<string, ParamBinding> GetDict2(int placeid);
OE>    }
OE>


см. выделенное жирным.


Как видно из примеров, в одном случае используется @PersonId а в другом ID. Разница в следующем: если не указано "@", то значение берётся из поля уже смапленного объекта, если "@" присутствует, то из исходной записи.

Зачем это надо. Первый случай может пригодиться, если словарь строится по полю, которое явно не отображается на исходную запись. Например, какое-нибудь составное поле в объекте. Второй случай может понадобиться, когда нужно построить словарь по полю, которое есть в исходном рекордсете, но не отображается на объект. Если ключевое поле один в один отображается на объект, то разницы нет.

отсюда, а оригинал где-то на форуме

можно, конечно обучить маппер более гибкому подходу, если надо.
но в общем и целом, если есть "@" то мапит по алиасу, а если нет, то по имени свойства.
Re[2]: IndexAttribute
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 31.08.09 14:56
Оценка:
Здравствуйте, ili, Вы писали:

ili>Как видно из примеров, в одном случае используется @PersonId а в другом ID. Разница в следующем: если не указано "@", то значение берётся из поля уже смапленного объекта, если "@" присутствует, то из исходной записи.


я почему-то когда доку читал понял с точностью до наоборот
... << RSDN@Home 1.2.0 alpha 4 rev. 1238>>
Re[3]: IndexAttribute
От: ili Россия  
Дата: 01.09.09 04:53
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>Здравствуйте, ili, Вы писали:


ili>>Как видно из примеров, в одном случае используется @PersonId а в другом ID. Разница в следующем: если не указано "@", то значение берётся из поля уже смапленного объекта, если "@" присутствует, то из исходной записи.


OE>я почему-то когда доку читал понял с точностью до наоборот


да, пожалуй туманно и размыто написано, надо бы поправить
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.