实体框架,查看而不是插入触发器。无法在视图中插入行

时间:2014-11-12 21:12:06

标签: sql-server entity-framework tsql view triggers

我无法在映射视图中插入实体。 我得到的错误是:

  

存储,插入或删除语句会影响意外的行数(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; }
}

任何人都可以帮助我吗?

2 个答案:

答案 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保存更改,则需要通过实际表本身来完成。遗憾。