更改持久性层时更改域实体
本文关键字:实体 持久性 | 更新日期: 2023-09-27 18:35:28
在我的应用程序中,我一直在使用将其ID存储为字符串的数据库。数据库还为每个文档/行存储了另一个属性(Etag)。因此,我的域实体派生自此基类:
public class EntityBase : NotifyPropertyChangedBase
{
public string Id { get; set; }
public Guid ETag { get; set; }
}
现在,我正在向应用程序添加另一个数据层,并且不想删除旧数据层。能够根据运行时决策切换和使用特定的数据层会很好。问题是我想将 Id 存储为新数据库中的 int。而ETag在新数据库中是一个不必要的概念。
我正在努力管理这种变化。如果我将 EntityBase.Id 更改为 int,则旧数据层将无法编译。如果使用旧数据层,我想使用某个实体库,如果我使用新数据层,我想使用不同的实体库。这只是一个想法。也许有更好的方法?关于如何完成这项工作的任何建议?
顺便说一句,我认为持久性层问题不应该在域层对象中起作用(例如 Id 是字符串或 int)。然而,为时已晚,这就是我发现自己的情况。我希望有人对如何进行有一些好的建议。
我正在考虑将Id2添加到EntityBase:
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 转换为字符串。
我建议再加一层。例如,要创建一个像这样的新类:
public abstract class CommonEntityBase<T> : NotifyPropertyChangedBase{
public T Id {get;set;}
}
然后,从此类派生旧的实体库:
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 时出现性能问题。