0

在我的应用程序中,我一直在使用将其 ID 存储为字符串的数据库。数据库还为每个文档/行存储了另一个属性(Etag)。因此,我的域实体派生自这个基类:

public class EntityBase : NotifyPropertyChangedBase
{
    public string Id { get; set; }
    public Guid ETag { get; set; }
}

现在我正在向我的应用程序添加另一个数据层,我不想删除旧的。如果能够根据运行时决策切换和使用特定的数据层,那就太好了。问题是我想将 Id 作为 int 存储在新数据库中。ETag 在那个新数据库中是一个不必要的概念。

我正在为如何管理这种变化而苦苦挣扎。如果我将 EntityBase.Id 更改为 int,则旧数据层将无法编译。如果使用旧数据层,我想使用某个 EntityBase,如果我使用新数据层,我想使用不同的 EntityBase。这只是一个想法。也许有更好的方法?关于如何完成这项工作的任何建议?

顺便说一句,我认为持久层问题不应该在域层对象中起作用(比如 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。还在想……我可能被卡住了……

作为 hack,我可以保留 EntityBase 的原始形式。然后,在新的 DAL 中,当我执行 ORM 时,我可以将表的 ID 转换为字符串。

4

1 回答 1

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 时导致性能问题。

于 2012-05-26T04:01:46.340 回答