Здравствуйте, Сим, Вы писали:
Сим>Есть ли в 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;
}
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Сим, Вы писали:
Сим>>Есть ли в RFD механизмы для мапинга таких структур при вставке? Чтобы можно было сделать что-то вроде (без явной передачи всех параметров):
IT>Есть два варианта. IT>1. Использование атрибутов MapField
Да, так действительно работает, но вот есть некоторая нестыковка в логике работы вставки и выборки, как мне кажется, и связана она с nullable значениями:
При вставке вложенного объекта чтобы установить внешние ключи в null, нужно чтобы сам объект был равен null.
Однако при выборке вложенные объекты всегда должны быть проинициализированы, т.е. в любом случае не могут быть равны null. Хочется иметь единообразный способ работы со вложенными объектами.
Как можно решить эту проблему?
Здравствуйте, Сим, Вы писали:
Сим>Однако при выборке вложенные объекты всегда должны быть проинициализированы, т.е. в любом случае не могут быть равны null. Хочется иметь единообразный способ работы со вложенными объектами. Сим>Как можно решить эту проблему?
Решить можно. Если у объекта присутствует конструктор с параметром MapInitializingData, то маппер будет использовать именно его для создания объекта. Среди прочих у MapInitializingData есть свойство DataSource. Из него можно узнать присутствует ли объект в записи и принять решение стоит его создавать или не надо.
Второй вариант — возложить эту задачу на прокси, но тут мы плавно переходим к асбстрактным классам и кодогенерации.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Сим, Вы писали:
Сим>>Однако при выборке вложенные объекты всегда должны быть проинициализированы, т.е. в любом случае не могут быть равны null. Хочется иметь единообразный способ работы со вложенными объектами. Сим>>Как можно решить эту проблему?
IT>Решить можно. Если у объекта присутствует конструктор с параметром MapInitializingData, то маппер будет использовать именно его для создания объекта. Среди прочих у MapInitializingData есть свойство DataSource. Из него можно узнать присутствует ли объект в записи и принять решение стоит его создавать или не надо.
IT>Второй вариант — возложить эту задачу на прокси, но тут мы плавно переходим к асбстрактным классам и кодогенерации.
А можно чуть поподробнее? В документации и в примерах ничего не нашел
Где можно почитать, если вообще можно?
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Сим, Вы писали:
Сим>>А можно чуть поподробнее? В документации и в примерах ничего не нашел Сим>>Где можно почитать, если вообще можно?
IT>На выходных набросаю какой-нибудь howto.
Здравствуйте, 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, то и вложеный объект должен оставиться нулевым.
Здравствуйте, Сим, Вы писали:
Сим>По умолчанию он равен 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;
}
Если нам не помогут, то мы тоже никого не пощадим.