【问题标题】:Entity Framework DBSet Extensions for type that implements an interface用于实现接口的类型的实体框架 DBSet 扩展
【发布时间】:2016-05-11 22:39:44
【问题描述】:

我正在尝试创建一些 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);
    }
}

但是,当我尝试在继承自 INWatchStandardEntityDbSet 上使用 GenerateId(string name) 时,这编译得很好,例如:

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

我收到以下消息:

DbSet&lt;Node&gt;”不包含“GenerateId”的定义,并且 最佳扩展方法重载 'NWatchDbSetExtensions.GenerateId(DbSet&lt;INWatchStandardEntity&gt;, string)' 需要类型为 'DbSet&lt;INWatchStandardEntity&gt;' 的接收器

有没有办法使此扩展方法和其他扩展方法可用,以便我可以将它用于 Entity 实现 INWatchStandardEntity 的任何 DbSet?

【问题讨论】:

  • this DbSet&lt;INWatchStandardEntity&gt; dbSet更改为this DbSet&lt;TEntity&gt; dbSet
  • 当我这样做时,我收到消息“类型 'TEntity' 必须是引用类型才能将其用作泛型类型或方法 'DbSet 中的参数'TEntity' ' '。

标签: c# .net entity-framework generics


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 2014-04-28
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    相关资源
    最近更新 更多