更改持久层时更改域实体

时间:2012-05-26 03:42:54

标签: c# oop

在我的应用中,我一直在使用将其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转换为字符串。

1 个答案:

答案 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时,这可能会导致性能问题。