更改持久性层时更改域实体

本文关键字:实体 持久性 | 更新日期: 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 时出现性能问题。