实体框架DBSet Extensions用于实现接口的类型

时间:2016-05-11 22:39:44

标签: c# .net entity-framework generics

我正在尝试创建DbSet<T>T扩展,其中INWatchStandardEntity实现了public static class NWatchDbSetExtensions { public static Int32 GenerateId<TEntity>(this DbSet<INWatchStandardEntity> dbSet, string name) where TEntity : INWatchStandardEntity, new() { NWatchObjectType objectType = Common.ToObjectType(dbSet.GetType()); return Common.GetObjectIdFromName(objectType, name); } }

以下是其中一个例子:

GenerateId(string name)

但是,当我尝试使用DbSet继承自INWatchStandardEntity的{​​{1}}时,此编译很好,例如:

using (var context = Application.GetDbContext()) {
    context.Nodes.GenerateId<INWatchStandardEntity>("name"); 
}

我收到以下消息:

  

&#39; DbSet<Node>&#39;不包含&#39; GenerateId&#39;的定义和   最佳扩展方法过载   &#39; NWatchDbSetExtensions.GenerateId(DbSet<INWatchStandardEntity>,   string)&#39;需要{&lt; DbSet<INWatchStandardEntity>&#39;

类型的接收器

有没有办法让这个和其他扩展方法可用,以便我可以对任何实体实现INWatchStandardEntity的DbSet使用它?

1 个答案:

答案 0 :(得分:2)

经过一些实验,这是正确的方法:

public static Int32 GenerateId<TEntity>(this DbSet<TEntity> dbSet, string name) 
    where TEntity : class, INWatchStandardEntity
{
    NWatchObjectType objectType = Common.ToObjectType(dbSet.GetType());
    return Common.GetObjectIdFromName(objectType, name);
}