Вложеные объекты и вставка
От: Сим Россия  
Дата: 11.01.06 18:09
Оценка:
Есть классы типа:

class ObjType
{
public int Id;
public string Name
}

class Obj
{
public string Name;
public ObjType Type;
}

Есть таблица Objs:
Id,
Name,
objTypeId

т.е. ObjType — это что-то вроде справочника

Есть ли в RFD механизмы для мапинга таких структур при вставке? Чтобы можно было сделать что-то вроде (без явной передачи всех параметров):

db.SetSpCommand("InsertObj", db.CreateParameters(obj)).ExecuteNonQuery();
Re: Вложеные объекты и вставка
От: IT Россия linq2db.com
Дата: 12.01.06 03:16
Оценка:
Здравствуйте, Сим, Вы писали:

Сим>Есть ли в RFD механизмы для мапинга таких структур при вставке? Чтобы можно было сделать что-то вроде (без явной передачи всех параметров):


Есть два варианта.

1. Использование атрибутов MapField

class ObjType
{
  public int Id;
  public string Name
}

[MapField("ObjTypeId",   "Type.Id")]
[MapField("ObjTypeName", "Type.Name")]
class Obj 
{
  public string Name;
  public ObjType Type;
}


Сим>db.SetSpCommand("InsertObj", db.CreateParameters(obj)).ExecuteNonQuery();


Вставка тоже должна работать.

2. Вариант только на чтение с использованием ResultSets.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Вложеные объекты и вставка
От: Сим Россия  
Дата: 12.01.06 13:59
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Сим, Вы писали:


Сим>>Есть ли в RFD механизмы для мапинга таких структур при вставке? Чтобы можно было сделать что-то вроде (без явной передачи всех параметров):


IT>Есть два варианта.

IT>1. Использование атрибутов MapField

Да, так действительно работает, но вот есть некоторая нестыковка в логике работы вставки и выборки, как мне кажется, и связана она с nullable значениями:
При вставке вложенного объекта чтобы установить внешние ключи в null, нужно чтобы сам объект был равен null.
Однако при выборке вложенные объекты всегда должны быть проинициализированы, т.е. в любом случае не могут быть равны null. Хочется иметь единообразный способ работы со вложенными объектами.
Как можно решить эту проблему?
Re[3]: Вложеные объекты и вставка
От: IT Россия linq2db.com
Дата: 12.01.06 18:49
Оценка:
Здравствуйте, Сим, Вы писали:

Сим>Однако при выборке вложенные объекты всегда должны быть проинициализированы, т.е. в любом случае не могут быть равны null. Хочется иметь единообразный способ работы со вложенными объектами.

Сим>Как можно решить эту проблему?

Решить можно. Если у объекта присутствует конструктор с параметром MapInitializingData, то маппер будет использовать именно его для создания объекта. Среди прочих у MapInitializingData есть свойство DataSource. Из него можно узнать присутствует ли объект в записи и принять решение стоит его создавать или не надо.

Второй вариант — возложить эту задачу на прокси, но тут мы плавно переходим к асбстрактным классам и кодогенерации.
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Вложеные объекты и вставка
От: Сим Россия  
Дата: 13.01.06 10:46
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Сим, Вы писали:


Сим>>Однако при выборке вложенные объекты всегда должны быть проинициализированы, т.е. в любом случае не могут быть равны null. Хочется иметь единообразный способ работы со вложенными объектами.

Сим>>Как можно решить эту проблему?

IT>Решить можно. Если у объекта присутствует конструктор с параметром MapInitializingData, то маппер будет использовать именно его для создания объекта. Среди прочих у MapInitializingData есть свойство DataSource. Из него можно узнать присутствует ли объект в записи и принять решение стоит его создавать или не надо.


IT>Второй вариант — возложить эту задачу на прокси, но тут мы плавно переходим к асбстрактным классам и кодогенерации.


А можно чуть поподробнее? В документации и в примерах ничего не нашел
Где можно почитать, если вообще можно?
Re[5]: Вложеные объекты и вставка
От: IT Россия linq2db.com
Дата: 13.01.06 12:34
Оценка:
Здравствуйте, Сим, Вы писали:

Сим>А можно чуть поподробнее? В документации и в примерах ничего не нашел

Сим>Где можно почитать, если вообще можно?

На выходных набросаю какой-нибудь howto.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: Вложеные объекты и вставка
От: Сим Россия  
Дата: 16.01.06 11:19
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Сим, Вы писали:


Сим>>А можно чуть поподробнее? В документации и в примерах ничего не нашел

Сим>>Где можно почитать, если вообще можно?

IT>На выходных набросаю какой-нибудь howto.


Ну как успехи? Когда можно ожидать публикации?
Re[7]: Вложеные объекты и вставка
От: IT Россия linq2db.com
Дата: 16.01.06 15:52
Оценка:
Здравствуйте, Сим, Вы писали:

IT>>На выходных набросаю какой-нибудь howto.


Сим>Ну как успехи? Когда можно ожидать публикации?


Я помню, работаю над этим
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[7]: Вложеные объекты и вставка
От: IT Россия linq2db.com
Дата: 16.01.06 17:47
Оценка:
Здравствуйте, Сим, Вы писали:

Сим>Ну как успехи? Когда можно ожидать публикации?


Никак не могу придумать более менее достойного примера
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: Вложеные объекты и вставка
От: Сим Россия  
Дата: 16.01.06 17:54
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Сим, Вы писали:


Сим>>Ну как успехи? Когда можно ожидать публикации?


IT>Никак не могу придумать более менее достойного примера


Можно на примере моей проблемы
допустим есть вложеный объект

[MapField("ObjectTypeId", "ObjectType.Id")]
class MyBizObject
{
public int Id;
public string Name;
public ObjectType oType;
}

class ObjectType
{
public int Id;
public string Name;
}

По умолчанию он равен null. При попвтке вставить такой объект в базу в ObjectTypeId должен писаться null, т.к. предполагается что поле в базе nullable.
Если он заполнен, то вставляется соответствующее значение.
При выборке. Если ObjectTypeId != null, то oType инициализируется и заполняется нужными значениями. Если же в ObjectTypeId записан null, то и вложеный объект должен оставиться нулевым.
Re[9]: Вложеные объекты и вставка
От: IT Россия linq2db.com
Дата: 16.01.06 18:50
Оценка:
Здравствуйте, Сим, Вы писали:

Сим>По умолчанию он равен null. При попвтке вставить такой объект в базу в ObjectTypeId должен писаться null, т.к. предполагается что поле в базе nullable.

Сим>Если он заполнен, то вставляется соответствующее значение.
Сим>При выборке. Если ObjectTypeId != null, то oType инициализируется и заполняется нужными значениями. Если же в ObjectTypeId записан null, то и вложеный объект должен оставиться нулевым.

Можно сделать, например, так:

[MapField("ObjectTypeId", "ObjectType.Id")]
class MyBizObject
{
    MyBizObject()
    {
    }

    MyBizObject(MapInitializingData data)
    {
        if (data.DataSource != null)
        {
            object value = data.DataSource.GetFieldValue("ObjectTypeId", data.DataSource.SourceData);

            if (!Map.IsNull(value))
                oType = new ObjectType();
        }
    }

    public int Id;
    public string Name;
    public ObjectType oType;
}
Если нам не помогут, то мы тоже никого не пощадим.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.