2016-05-11 176 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); 
}