我无法在映射视图中插入实体。 我得到的错误是:
存储,插入或删除语句会影响意外的行数(0)
我知道如何使用存储过程,但是对于我来说,尝试在插入行视图事件中使用而不是触发器的解决方案更有趣。当我删除,更新或插入t-sql代码时,我没有收到任何错误,但我无法使用EF插入行。更新和删除EF中的工作,但INSERT没有。
代码:
create view TestInsert
as
select a.table_id, a.name
from TableA as a
create trigger tr_works_via_tsql_but_not_ef_for_some_reason
on TestInsert
instead of isert
begin
insert into TableA (table_id, name)
select table_id, name from inserted;
end
[Table(TestInsert)]
public class TestInsert
{
[Key]
public int table_id { get; set; }
public string name { get; set; }
}
任何人都可以帮助我吗?
答案 0 :(得分:10)
万岁,我找到了解决方案! 主体而不是触发器必须返回表格的ID 。
create trigger tr_works_via_tsql_but_not_ef_for_some_reason
on TestInsert
instead of isert
begin
insert into TableA (table_id, name)
select table_id, name from inserted;
**select id from TableA where @@ROWCOUNT > 0 and id = scope_identity()**
end
我使用直接映射,我的项目中没有edmx文件。 这是答案的来源: Entity Framework with Instead Of triggers
答案 1 :(得分:-2)
您无法插入SQL视图。视图仅用于显示由用户定义的某些查询逻辑确定的数据。您实际上无法保存到View,只能保存到基础表本身。如果你想调整View中的内容,你需要先保存到2个表中,然后它会在View中弹出。
编辑:你不能在EF中这样做。当您调用上下文的SaveChanges()
方法时,它会尝试保存记录并向您返回一个计数(因此该方法返回int
的原因)。问题在于,当它确实尝试保存它时,它无法保存,并抛出异常,您将看到它保存的意外行数在哪里,即0(而不是它注意到的行数)在上下文中改变了)。如果要通过EF保存更改,则需要通过实际表本身来完成。遗憾。