EF中的Generic Id属性

本文关键字:属性 Id Generic 中的 EF | 更新日期: 2023-09-27 17:57:29

我有现有的解决方案,它使用代码优先的方法。它将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;
    }
}

CCD_ 8本身由通用存储库CCD_ 9使用。一切正常。

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

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

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

EF中的Generic Id属性

如果在Repository<T>方法中仅使用IsNew,则可以为此分离接口。像

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

所以你可以将你的方法声明为

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

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

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

然后你的IPersistentEntity会是这样的:

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