将更改保存到映射到视图的实体

时间:2019-03-04 06:37:30

标签: entity-framework entity-framework-6

我可以使用实体框架将更改保存到视图吗?

我有一个映射到视图的实体。

[Table("MyView")]
public class MyEntity
{
    public long MyEntityId { get; set; }

    public string Name { get; set; }
}

视图本身是这样的:

CREATE VIEW MyView AS 
SELECT 
    t.MyEntityId,
    t.Name,
FROM 
    MyTable t

我可以使用Entity Framework更改跟踪将更改保存到该视图吗?这样的可能性是可能的:

var record = Context.MyEntity.Where(e => e.MyEntityId == 150).FirstOrDefault();
record.Name = "New Name";
Context.SaveChanges();

1 个答案:

答案 0 :(得分:0)

看起来像Entity Framework不在乎该实体是否映射到视图或表...它只会创建相同的更新脚本。对于上面的示例,EF生成以下脚本:

UPDATE [MyView] SET [Name]=@gp1 WHERE [MyEntityId] = 150
-- @gp1: 'New Name' (Type = String, IsNullable = false, Size = 8)

因此,EF不会对更新视图引入任何其他限制...,但是我们仍然具有RDBMS特定的更新视图限制...例如,在SQL Server中可以更新视图subject to the following limitations

  
      
  • 如果视图包含多个表之间的联接,则只能在视图中插入和更新一个表,并且不能删除行。

  •   
  • 您不能基于联合查询直接在视图中修改数据。您不能在使用GROUP BY或DISTINCT语句的视图中修改数据。

  •   
  • 所有要修改的列都受到相同的限制,就如同直接针对基数执行语句一样   表。

  •   
  • 文本和图像列无法通过视图进行修改。

  •   
  • 不检查视图条件。例如,如果该视图选择了居住在巴黎的所有客户,并且数据被修改为
      添加或编辑不具有City ='Paris'数据的行
      将在基表中修改,但不会在视图中显示,除非
      定义视图时使用WITH CHECK OPTION。

  •