在我的应用中,我一直在使用将其ID存储为字符串的数据库。 DB还为每个文档/行存储了另一个属性(Etag)。因此,我的域实体派生自这个基类:
public class EntityBase : NotifyPropertyChangedBase
{
public string Id { get; set; }
public Guid ETag { get; set; }
}
现在我正在为我的应用程序添加另一个数据层,我不想删除旧的数据层。能够根据运行时决策切换和使用特定数据层会很好。问题是我想将Id存储为新DB中的int。 ETag在新数据库中是一个不必要的概念。
我正在努力解决如何管理这一变化。如果我将EntityBase.Id更改为int,则旧数据层将无法编译。如果使用旧数据层,我想使用某个EntityBase,如果我使用新数据层,我想使用不同的EntityBase。这只是一个想法。也许有更好的方法?关于如何使这项工作的任何建议?
顺便说一下,我认为持久层问题不应该在那里工作到域层对象(比如Id是字符串或int)。但是,为时已晚,这就是我发现自己的情况。我希望有人对如何继续提出一些好的建议。
我正在考虑向EntityBase添加Id2:
public class EntityBase : NotifyPropertyChangedBase
{
public string Id { get; set; }
public int Id2 { get; set; } // New property for new DB only
public Guid ETag { get; set; }
}
然后,在我的新DAL映射中,我将表中的Id列映射到Id2而不是Id。但这不会起作用,因为我的业务逻辑仅引用了Id。还在想......我可能会被卡住......
作为一个黑客,我可以将EntityBase保留为原始形式。然后,在新的DAL中,当我执行ORM时,我可以将表的ID转换为字符串。
答案 0 :(得分:0)
我建议再添加一层。 例如,要创建一个这样的新类:
public abstract class CommonEntityBase<T> : NotifyPropertyChangedBase{
public T Id {get;set;}
}
然后,从这个类派生你的旧EntityBase:
public class EntityBase : CommonEntityBase<string>{
//this property is present only in this old implementation
public Guid ETag { get; set; }
}
现在,您可以创建一个新图层并使用基类:
public class FancyEntityBase : CommonEntityBase<int>{
//No ETag concept here - ad new properties, methods, etc.
}
但是,如果您确实需要将主键更改为整数,则存在一个问题。 使用ORM时,这可能会导致性能问题。