我有一个几乎相同的数据库的两个版本。下面我创建了一个示例表来演示基本的区别,即ID列已经从整型身份更改为GUID并且各种属性已更新,在示例中,存档已被替换为readOnly和hidden:如何松散地耦合.NET应用程序中的数据库列?
Legacy版本:
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映射工具,如NHibernate的连接到这些数据库版本中的一个或其他。我希望能够通过配置文件中的设置来告诉应用程序使用哪个版本。
我的最初的计划是创建用于业务逻辑的通用接口,并使用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; }
}
任何人都可以提出建议,如果这是可能的(特别是与团结和NHibernate),如果是如何创建的有关NHibernate的映射文件?
可替换地,任何人都可以提出任何解决方案来使用任何其他方法或其他IOC和O/R映射工具(商业或开源)的问题?
非常感谢,
保罗