EF - context.Set <t> vs context.T

时间:2017-03-16 09:48:06

标签: c# entity-framework

从月开始,我想知道使用 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();

谢谢:)

2 个答案:

答案 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();