我使用包含视图的Entity Framework。我有疑问:
var data = this.context.vwRevenues
.Where(x => x.revenue >= 0);
.OrderByDescending(x => x.year)
.ThenByDescending(x => x.month)
.Take(10)
.ToList();
此查询返回实体集,但第一个实体等于第5个。
data[0] == data[4] // true
我从sql tracer获取此查询的sql脚本并将其运行到SQL Management Studio中, 它返回不同的记录。
答案 0 :(得分:79)
根据 @Giovane 答案
我们的系统中存在同样的问题,实体框架处理视图。尝试使用ROW_NUMBER()OVER()SQL创建一个具有唯一值的列,但不起作用。
我做了同样的事情,但要使其工作,我需要打开EDMX模型,然后选择此列作为实体密钥。
然后它会起作用
关于这个
有一篇非常好的文章文章最重要的一行是:
在实体模型中包含视图时,模型似乎只是使用第一个不可为空的列作为主键(因为主键中使用的所有列都应该是不可为空的)。 / EM> 强>
答案 1 :(得分:44)
您只需:context.viewname.AsNoTracking().Where(x => x.ColumnName != null);
答案 2 :(得分:12)
我们的系统中存在同样的问题,实体框架处理视图。尝试使用ROW_NUMBER()OVER()SQL创建一个具有唯一值的列,但不起作用。
我们需要在视图中为另一个表插入一个更多的字段,一个FK,以便它可以作为mebro EntityKeyMembers Elimite的附加培训添加,以及重复的问题。
因此,如果问题在这种情况下仍然存在,解决方案是为它插入一个FK列,使其成为构成表的EntityKey的字段的成员。
答案 3 :(得分:2)
在视图中尝试将第一个记录转换为非空值,如下所示:
isnull(ROW_NUMBER() OVER (ORDER BY "Column"), 0) AS Row
它向实体框架指示可以自动成为主键。
答案 4 :(得分:1)
如果您不想更新edmx并将任何键设置为列&&
如果您不想更新查看记录(仅用于获取记录),请使用以下代码为我工作。
context.viewname.MergeOption = System.Data.Objects.MergeOption.NoTracking;
context.viewname.Where(x => x.columnname != null);