我可以使用实体框架将更改保存到视图吗?
我有一个映射到视图的实体。
[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();
答案 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。