将IDbSet <class>传递给泛型方法

rsa*_*lit 1 .net c# generics entity-framework c#-4.0

我确信这是非常基本的,但我在构建泛型方法时遇到了麻烦.我在我的声明众多接口DBContext类(IDbSet<Person>,IDbSet<Organizations>,等).我想将它们传递给一个处理它们的方法.在这种情况下,删除记录.这是我试图做的,但我无法弄清楚如何创建方法签名.

private static void EmptyTable<T>(ContactContext context, T records)
    {

        foreach (var record in records)
        {
            records.Remove(record);
        }
        context.SaveChanges();
    }
Run Code Online (Sandbox Code Playgroud)

Dar*_*opp 6

这里的问题是你有2种泛型类型.一个是集合类型,另一个是集合包含的元素的类型.

我建议你改变你的签名

private static void EmptyTable<T>(ContactContext context, IDbSet<T> records)
Run Code Online (Sandbox Code Playgroud)

这是最简单的方法.否则你将需要做一些更奢侈的事情

private static void EmptyTable<T,E>(ContactContext context, T records) 
    where T : IDbSet<E>
Run Code Online (Sandbox Code Playgroud)

顺便ICollection<T>说一下,原因是它是暴露Remove方法的最简单的接口,而IDbSet实现了我想要的接口.

原来IDbSet没有实现ICollection,所以...你将不得不使用IDbSet