从月开始,我想知道使用 context.Set vs context.T 而不是语法有什么不同。
我用这个试图从EF上下文从User表信息中获取UserName的快速代码来说明这个问题。
context.Set方法
context.Set<User>().Where(u => u.Id = userId).Select(u => u.UserName).Single();
context.T方法
context.Users.Where(u => u.Id = userId).Select(u => u.UserName).Single();
谢谢:)
答案 0 :(得分:1)
正如Rufo先生已经指出的那样,没有区别。 你可以使用
Utils.logCurrentFunc(#file, funcStr: #function)
因为您在上下文类中声明了context.Users
类型的属性Users
:
DbSet<User>
答案 1 :(得分:1)
在某些情况下,您需要使用context.Set<T>
,因为您在编码时不知道T
的值,它将在运行时设置
例如在通用存储库中:
public abstract class Entity
{
public int Id { get; set; }
}
public class User:Entity
{
public string Name { get; set; }
}
public class Product:Entity
{
public string ProductName { get; set; }
}
public class ApplicationDBContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Product> Products { get; set; }
}
public class Repo<T> where T:Entity
{
public IList<T> GetList()
{
using (var context = new ApplicationDBContext())
{
return context.Set<T>().ToList();
}
}
}
然后您可以将GetList
与任何实体一起使用,如下所示:
var userRepo = new Repo<User>();
var users = userRepo.GetList();
var productRepo = new Repo<Product>();
var products = productRepo.GetList();