Параметры задания команды вынесены из методов Execute в методы SetCommand и SetSpCommand.
Добавлен метод Update.
Расширено применение атрибута MapTypeAttribute.
Добавлена поддержка интерфейса ISupportInitialize.
Добавлен интерфейс IMapSettable.
SetCommand, SetSpCommand
Основные изменения данной версии коснулись класса DbManager. Из методов Execute... вынесены параметры, отвечающие за формирование выполняемой команды. Так, если вызов метода ExecuteScalar ранее выглядел следующим образом
using (DbManager db = new DbManager())
{
return (int)db.ExecuteScalar("SELECT Count(*) FROM Categories");
}
то теперь его вызову должен предшествовать вызов метода SetCommand или SetSpCommand:
using (DbManager db = new DbManager())
{
return (int)db
.SetCommand("SELECT Count(*) FROM Categories")
.ExecuteScalar();
}
Старые методы объявлены obsolete и будут удалены в следующей версии библиотеки.
Update
Метод Update представляет собой обёртку для вызова метода DbDataAdapter.Update. Для задания команд вставки обновления и удаления используются соответствующие методы SetInsertCommand, SetUpdateCommand, SetDeleteCommand.
using (DbManager db = new DbManager())
{
db
.SetInsertCommand("INSERT statement")
.SetUpdateCommand("UPDATE statement")
.SetDeleteCommand("DELETE statement")
.Update(dataSet);
}
MapTypeAttribute
Данный атрибут обзавёлся набором параметров, которые могут быть переданы конструктору класса, имплементирующего абстрактное свойство. Например:
public abstract class MyBizEntity : BizEntityBase
{
[MapType(typeof(RequiredString), "Description", 20)]
public abstract string Description { get; set; }
}
См. полный пример использования данного атрибута в документации.
ISupportInitialize
Если класс, участвующий в маппинге реализует интерфейс ISupportInitialize, то маппер вызовет метод BeginInit перед началом отображения и EndInit перед его завершением.
Данный интерфейс имеет всего лишь один метод – SetField. В процессе отображения поля источника передаются в этот метод одно за другим. Если объект обрабатывает поле самостоятельно, то он должен вернуть true. В противном случае маппер попытается произвести отображение самостоятельно. Следующий пример демонстрирует применение данного интерфейса для реализации свойства ID базового класса бизнес объектов:
public abstract class BizEntityBase : IMapSettable
{
private Guid _id;
public Guid ID { get { return _id; } }
bool IMapSettable.SetField(string fieldName, object value)
{
if (string.Compare(fieldName, GetType().Name + "ID") == 0)
{
_id = (Guid)value;
return true;
}
return false;
}
}
Спасибо всем принявшим участие в обсуждение библиотеки.
Отдельное спасибо Андрею Касьянову за ценные замечания и предложения.
30.04.04 06:48: Перенесено из '.NET Projects'
Если нам не помогут, то мы тоже никого не пощадим.
Прошу прощения, может я не так чего делаю, но похоже, что такая конструкция
using (DbManager db = new DbManager())
{
db
.SetInsertCommand("INSERT statement")
.SetUpdateCommand("UPDATE statement")
.SetDeleteCommand("DELETE statement")
.Update(dataSet);
}
Так вот, условие if (cmd == null) срабатывает ОДИН раз (вместо трех для каждой команды).
В результате _selectCommand, _insertCommand, _updateCommand и _deleteCommand смотрят на один и тот же объект.
Проблема решилась обнулением _selectCommand:
И в PrepareCommand() переделать вызов GetCommand() на новую версию с тремя параметрами, тогда все будет чики-чики. В принципе ф-ю GetCommand() с двумя параметрами можно вообще выкинуть, она по-моему все равно больше нигде не используется, но это по желанию.
IT, схалявил на тестах? Надо теперь выпускать версию с фиксом. Так глядишь, разрастешься и на automatic updates придется переходить
Здравствуйте, Walker, Вы писали:
W>IT, схалявил на тестах?
Признаюсь, схалявил... первый раз в жизни
W>Надо теперь выпускать версию с фиксом. Так глядишь, разрастешься и на automatic updates придется переходить
Придётся
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Добавления и исправления версии 1.3
У меня не работает следующий фрагмент (ошибка при компиляции)
Я специально упростил код до предела:
using System;
using Rsdn.Framework.Data;
using Rsdn.Framework.Data.Mapping;
namespace ConsoleApp
{
public enum TriState
{
Yes,
No,
NotApplicable
};
public class TestMap
{
[STAThread]
static void Main(string[] args)
{
TestMap.TestChangeType();
}
public static void TestChangeType()
{
MapDescriptor.SetMappingSchema(@"D:\Projects\Research\RSDNTest\Mapping.xml");
}
}
}
An unhandled exception of type 'Rsdn.Framework.Data.Mapping.RsdnMapException' occurred in rsdn.framework.data.dll
Additional information: Error during parsing the 'D:\Projects\Research\RSDNTest\Mapping.xml' file: The 'name' attribute is not declared. An error occurred at , (3, 14).
using System;
using Rsdn.Framework.Data;
using Rsdn.Framework.Data.Mapping;
namespace ConsoleApp
{
public enum TriState {Yes, No, NotApplicable};
public class TestMap
{
[STAThread]
static void Main(string[] args)
{
TestMap.TestChangeType();
}
public class Src
{
public string Field1 = "no";
}
[MapXml("Dest")]
public class Dest
{
private TriState _f1 = TriState.NotApplicable;
public TriState Field1
{
get
{
return _f1;
}
set
{
_f1 = value;
}
}
}
public static void TestChangeType()
{
MapDescriptor.SetMappingSchema(@"D:\Projects\Research\RSDNTest\Mapping.xml");
Src s = new Src();
Dest d = (Dest)Map.ToObject(s, typeof(Dest));
string temp = d.Field1.ToString();
Console.WriteLine(temp);
}
}
}
Использовал старый RFD, сегодня проапдейтился и это чудо стало отстреливать студию намертво, в режиме дебуга.
Вот в этой функции:
object IMapDataSource.GetFieldValue(int i, object entity)
{
return ((IMemberMapper)_memberList[i]).GetValue(entity);
}
Причём неважно, делаешь ли вход внутрь, или step over, или просто брякпоинт ставишь — после выполнения этой строчки в каком-то режиме студии становится очень плохо. Причём оно много раз выполняется нормально, но однажды, в совершенно конкретный момент, отстреливается. Пытаюсь поймать, в чём же дело...
using System;
using Rsdn.Framework.Data;
using Rsdn.Framework.Data.Mapping;
namespace ConsoleApp
{
public enum TriState {Yes, No, NotApplicable};
public class TestMap
{
[STAThread]
static void Main(string[] args)
{
TestMap.TestChangeType();
}
public class Src
{
public string Field1 = "no";
}
[MapXml("Dest")]
public class Dest
{
private TriState _f1 = TriState.NotApplicable;
public TriState Field1
{
get
{
return _f1;
}
set
{
_f1 = value;
}
}
}
public static void TestChangeType()
{
MapDescriptor.SetMappingSchema(@"D:\Projects\Research\RSDNTest\Mapping.xml");
Src s = new Src();
Dest d = (Dest)Map.ToObject(s, typeof(Dest));
string temp = d.Field1.ToString();
Console.WriteLine(temp);
}
}
}
Здравствуйте, orangy, Вы писали:
O>Здравствуйте, IT, Вы писали:
O>Использовал старый RFD, сегодня проапдейтился и это чудо стало отстреливать студию намертво, в режиме дебуга. O>Вот в этой функции: O>
O>Причём неважно, делаешь ли вход внутрь, или step over, или просто брякпоинт ставишь — после выполнения этой строчки в каком-то режиме студии становится очень плохо. Причём оно много раз выполняется нормально, но однажды, в совершенно конкретный момент, отстреливается. Пытаюсь поймать, в чём же дело...
случайно не value type используешь как entity?
у меня было похожее, валится не студия, а вообще весь дотнет валится и говорит, что испортили среду выполнения.