EF中的通用Id属性

时间:2014-04-08 15:39:03

标签: c# entity-framework generics

我有现有的解决方案,它采用代码优先的方法。 它有PersistentEntity作为所有实体的基类。

public interface IPersistentEntity
{
    int Id { get; }
    bool IsNew { get; }
}

public abstract class PersistentEntity : IPersistentEntity, IValidatableObject
{
    // some code here
}

PersistentEntity用作验证对象+覆盖Equals()GetHashCode()的默认行为。 Id属性的类型int - > IsNew属性具有简单的实现:

public bool IsNew
{
    get
    {
        return this.Id == 0;
    }
}

IsNew本身由通用存储库Repository使用。一切正常。

但是现在我们决定使用Guid作为我们的一个实体的Id,这有点打破了设计。 第一个想法是以通用方式实现PersistentEntity - &gt; PersistentEntity<T>,这很好,但在这种情况下,它会破坏通用Repository<T>

IEntityRepository<T> Repository<T>() where T : class, IPersistentEntity<??>

解决此问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

如果在IsNew方法中仅使用Repository<T>,则可以为此分隔界面。像

public interface IPersistentEntity 
{
    bool IsNew { get; } 
}

public interface IPersistentEntity<T> : IPersistentEntity
{
    T Id { get; }
}

因此,您可以将方法声明为

IEntityRepository<T> Repository<T>() where T : class, IPersistentEntity

答案 1 :(得分:0)

您可以传递多个Generic值,如下所示:

Repository<T, TIdent>() where T : class, IPersistentEntity<TIdent>

然后你的IPersistentEntity看起来像这样:

public interface IPersistentEntity<out TIdent>
{
    TIdent Id { get; }
    bool IsNew { get; }
}