我有一个几乎相同的数据库的两个版本。下面我创建了一个示例表来演示基本差异,即 ID 列已从 Integer Identity 更改为 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
)
我需要能够使用诸如 NHibernate 之类的 O/R 映射器来连接到这些数据库版本中的一个或其他。我希望能够通过配置文件中的设置告诉应用程序使用哪个版本。
我最初的计划是为业务逻辑创建一个通用接口,并使用 Unity 等 IoC 容器在配置文件中的相关具体类之间进行交换。
以下是我为测试该理论而创建的代码示例:
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 映射工具(商业或开源)提出任何解决问题的方法吗?
非常感谢,
保罗