J'ai deux versions d'une base de données presque identique. J'ai créé ci-dessous une table d'exemple pour démontrer les différences fondamentales, à savoir que la colonne ID est passée d'une identité entière à un GUID et que diverses propriétés ont été mises à jour ; dans l'exemple, archivé a été remplacé par readOnly et hidden :
Version héritée :
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
)
Nouvelle version :
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
)
Je dois pouvoir utiliser un mappeur O/R tel que NHibernate pour me connecter à l'une ou l'autre de ces versions de base de données. J'aimerais pouvoir indiquer à l'application quelle version utiliser par le biais de paramètres dans un fichier de configuration.
Mon plan initial consistait à créer une interface commune pour la logique commerciale et à utiliser un conteneur IoC tel que Unity pour échanger les classes concrètes pertinentes dans le fichier de configuration.
Vous trouverez ci-dessous un exemple du code que j'ai créé pour tester cette théorie :
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; }
}
Quelqu'un peut-il nous dire si c'est possible (en particulier avec Unity et NHibernate) et si oui, comment créer les fichiers de mapping NHibernate appropriés ?
Par ailleurs, quelqu'un peut-il suggérer une solution au problème en utilisant d'autres méthodes ou d'autres outils de cartographie IoC et O/R (commerciaux ou open source) ?
Merci beaucoup,
Paul