У меня есть две версии почти идентичной базы данных. Ниже я создал таблицу примеров, чтобы продемонстрировать основные различия, а именно: столбец идентификатора был изменен с целочисленного идентификатора на GUID, а различные свойства были обновлены, в архиве примера был заменен readOnly и скрыт:
Старая версия:
CREATE TABLE Example
(
--Data Identity (maps to DbId in the example code)
Id int IDENTITY PRIMARY KEY,
--Example columns
SomeValue varchar(50),
AnotherValue int,
--Data Properties
Archived bit
)
Новая версия:
CREATE TABLE Example
(
--Data Identity (maps to DbId in the example code)
Id uniqueidentifier PRIMARY KEY,
--Example columns
SomeValue varchar(50),
AnotherValue int,
--Data Properties
ReadOnly bit,
Hidden bit
)
Мне нужно иметь возможность использовать O / R Mapper, такой как NHibernate, для подключения к одной или другой из этих версий базы данных. Я бы хотел сообщить приложению, какую версию использовать через настройки в файле конфигурации.
Первоначально я планировал создать общий интерфейс для бизнес-логики и использовать контейнер IoC, например Unity, для переключения между соответствующими конкретными классами в файле конфигурации.
Ниже приведен пример кода, который я создал для проверки этой теории:
public interface IDataIdentity
{
object Id { get; }
}
public class LegacyDataIdentity : IDataIdentity
{
public virtual long DbId { get; set; }
public object Id
{
get { return DbId; }
}
}
public class NewDataIdentity : IDataIdentity
{
public virtual Guid DbId { get; set; }
public object Id
{
get { return DbId; }
}
}
public interface IDataProperties
{
bool ReadOnly { get; set; }
bool Hidden { get; set; }
}
public class LegacyDataProperties : IDataProperties
{
public virtual bool Archived { get; set; }
public bool ReadOnly
{
get { return Archived; }
set { Archived = value; }
}
public bool Hidden
{
get { return Archived; }
set { Archived = value; }
}
}
public class NewDataProperties : IDataProperties
{
public virtual bool ReadOnly { get; set; }
public virtual bool Hidden { get; set; }
}
public class DataItem
{
public DataItem(IDataIdentity dataIdentity, IDataProperties dataProperties)
{
DataIdentity = dataIdentity;
DataProperties = dataProperties;
}
public IDataIdentity DataIdentity { get; set; }
public IDataProperties DataProperties { get; set; }
}
public class Example : DataItem
{
public Example(IDataIdentity dataIdentity, IDataProperties dataProperties)
: base(dataIdentity, dataProperties)
{
}
public virtual string SomeValue { get; set; }
public virtual int AnotherValue { get; set; }
}
Кто-нибудь может посоветовать, возможно ли это (особенно с Unity и NHibernate), и если да, то как создать соответствующие файлы сопоставления NHibernate?
В качестве альтернативы, может ли кто-нибудь предложить какое-либо решение проблемы, используя любые другие методы или другие инструменты отображения IoC и O / R (коммерческие или открытые)?
Большое спасибо,
Пол