2016-05-11 129 views
0

我想创建一些DbSet<T>扩展,其中T实现INWatchStandardEntity实体框架DBSet扩展类型,实现接口

这里是其中之一任何例子:

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); 
    } 
} 

编译没有问题,但是,当我尝试在DbSetINWatchStandardEntity继承使用GenerateId(string name),例如:

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

我收到以下消息:

'DbSet<Node>“不包含定义‘GenerateId’和 最佳推广方法重载 ‘NWatchDbSetExtensions.GenerateId(DbSet<INWatchStandardEntity>string)’需要类型的接收器” DbSet<INWatchStandardEntity>

有没有一种方法,使这个和其他扩展方法可用,以便我可以使用它来抵御实体实现INWatchStandardEntity的任何DbSet?

+0

变化'这DbSet dbSet'到'这个DbSet dbSet' – Gusman

+0

当我这样做,我得到的消息''TEntity'类型必须是引用类型,以便将其用作通用类型或方法'DbSet '中的参数'TEntity'。 – blgrnboy

回答

1

一些实验后,这里就是这样做的正确方法:

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); 
}