具有 lambda 表达式的泛型
Generic with lambda expression
我正在尝试为使用 MongoDb 的非常具体的应用程序创建自定义 "DbContext" 的 "some kind"。我遇到了一个问题:
DbSet 是怎么知道 DbContext 存在的?
我的意思是,当我写
public DbSet<Assignment> Assignments { get; set; }
public DbSet<User> Users { get; set; }
在我的 DbContext 中,DbSet 实例如何获取对 DbContext 的引用 class?通过反射?
但是当我深入研究 EntityFramework source code 时,我遇到了另一个问题
public virtual DbSet<TEntity> Set<TEntity>() where TEntity : class => _setInitializer.Value.CreateSet<TEntity>(this);
在这个表达式中,我无法理解 "where" 子句中的 lambda 表达式。有没有人能赐教一下?
UPD
每次当我在 DbContext
中调用我的 DbSet 属性
public class BlogPostContextContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
DbSet 调用 DbContext 并对数据进行必要的操作。
我的问题是:DbSet 如何获取对 DbContext 的引用。
我问的是 DbSet 和 DbContext 之间的底层通信。
提前致谢。
请原谅我的英语。
伊万·塔拉拉耶夫
I cannot understand what does lambda expression in "where" clause.
方法声明有两部分。第一个是泛型类型约束:
where TEntity : class
这意味着在 TEntity
位置使用的任何类型都需要是 reference type。
第二部分是 Expression-bodied function:
=> _setInitializer.Value.CreateSet<TEntity>(this);
这是 C# 6.0 的一项功能。如果您的方法是单行代码,则可以将其声明为 类似于 Lambda 表达式。它只是意味着每次调用 Set
时,它都会调用该方法的一行 "body" 。编译器会把它变成一个命名方法 "behind the scenes".
How did DbSet know of DbContext existence?
它不知道直接。 DbContext
代表您的数据库,DbSet
代表该数据库中的一个 table。当你操纵你的 DbSet
时,它隐含地持有对其底层 DbContext
的引用并通过上下文添加它的实体。
我找到了问题最后一部分的答案。
根据 this and this EntityFramework 6 (not sure about new EF7)
DbSet 保留对 DbContext 的引用 _context
并使用它来添加或删除实体。
反过来 DbContext 以某种方式(可能通过反射)在调用 cunstructor 时在其所有 DbSet 类型的封装字段中设置引用 _context
。
我正在尝试为使用 MongoDb 的非常具体的应用程序创建自定义 "DbContext" 的 "some kind"。我遇到了一个问题:
DbSet 是怎么知道 DbContext 存在的?
我的意思是,当我写
public DbSet<Assignment> Assignments { get; set; }
public DbSet<User> Users { get; set; }
在我的 DbContext 中,DbSet 实例如何获取对 DbContext 的引用 class?通过反射?
但是当我深入研究 EntityFramework source code 时,我遇到了另一个问题
public virtual DbSet<TEntity> Set<TEntity>() where TEntity : class => _setInitializer.Value.CreateSet<TEntity>(this);
在这个表达式中,我无法理解 "where" 子句中的 lambda 表达式。有没有人能赐教一下?
UPD
每次当我在 DbContext
public class BlogPostContextContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
DbSet 调用 DbContext 并对数据进行必要的操作。 我的问题是:DbSet 如何获取对 DbContext 的引用。 我问的是 DbSet 和 DbContext 之间的底层通信。
提前致谢。
请原谅我的英语。
伊万·塔拉拉耶夫
I cannot understand what does lambda expression in "where" clause.
方法声明有两部分。第一个是泛型类型约束:
where TEntity : class
这意味着在 TEntity
位置使用的任何类型都需要是 reference type。
第二部分是 Expression-bodied function:
=> _setInitializer.Value.CreateSet<TEntity>(this);
这是 C# 6.0 的一项功能。如果您的方法是单行代码,则可以将其声明为 类似于 Lambda 表达式。它只是意味着每次调用 Set
时,它都会调用该方法的一行 "body" 。编译器会把它变成一个命名方法 "behind the scenes".
How did DbSet know of DbContext existence?
它不知道直接。 DbContext
代表您的数据库,DbSet
代表该数据库中的一个 table。当你操纵你的 DbSet
时,它隐含地持有对其底层 DbContext
的引用并通过上下文添加它的实体。
我找到了问题最后一部分的答案。
根据 this and this EntityFramework 6 (not sure about new EF7)
DbSet 保留对 DbContext 的引用 _context
并使用它来添加或删除实体。
反过来 DbContext 以某种方式(可能通过反射)在调用 cunstructor 时在其所有 DbSet 类型的封装字段中设置引用 _context
。