代码示例:
大致描述一下:
一个实体,有两个 field
public class Obj : IObj
{
string Name
Point Point // 外键关联的 InverseProperty
}
接口Iobj
有 Obj
两个字段的 Getter
dbContext.Objs.Select(o => s.GetName()) // 能用
dbContext.Objs.Select(o => s.GetPoint()) // 不能用
第二个会报command is already in progress
错误。
请 v 友给讲讲为什么,迷惑了半天不知道怎么查资料
1
madao1993 2022-03-19 23:40:53 +08:00
会不会和 LINQ 的 deferred evaluation 特性有关,select 得到的结果在被枚举之前不会执行
|
2
netnr 2022-03-20 07:07:18 +08:00 via Android
从数据库生成代码(Scaffold-DbContext),看看和你写的有没有区别
|
3
thinkershare 2022-03-20 15:26:04 +08:00
你的代码非常奇怪, 一般在 EF Core 中, 正常的写法是
```csharp public class Entity: IIterface { } ``` |
4
thinkershare 2022-03-20 15:31:52 +08:00
你的代码非常奇怪, 一般在 EF Core 中, 正常的写法是
public class Entity: IEntity{ public string Name{get;private set;} public virtual Point{get;private set;} } 很少使用 GetXxx 或者 SetXxx 的形式, 另外导航属性默认是懒加载的, 虽然你也可以将其调整为直接加载, 一般还是要手动 Include 的, 接口完全可以定义属性哈 |
5
yuhangch OP @thinkershare 是,哈哈,我一般也不这么写,主要写这个实例,不用 GetX 就和 X 重名了,显得有些怪
|
6
yuhangch OP @thinkershare
感谢👍,由于是接触 ef core 没多久,之前一直是直接加载,没用过 Include, include 之后确实可以了 ``` dbContext .Include(c => c.Point) .Select( s => new { Point = s.GetPoint(), }); ``` |