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<??>
解决这个问题的最佳方法是什么?
如果在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; }
}