防止分离的实体框架对象中的空更新

时间:2014-03-14 03:09:08

标签: asp.net linq-to-entities entity-framework-6 n-tier-architecture

使用EF6 Framework4.5 - 创建我的第一个n层应用程序和第一个EF体验。我有CRUD工作,但有一个问题,我有一个工作,但不喜欢它。肯定有更好的办法。

当数据对象从我的UI层返回到DAL层时,它已被分离,因此我将EntityState标记为“已修改”。但随后它会更新数据库中的所有列。未在表单视图中加载(未提交)的值显然为null,并在db。中更新为<。

1)我的第一个解决方案确实有效: 将对象存储在UI层中的会话中,并在提交表单时循环访问更新已编辑值的对象。因此,原始值不加改变地传回并更新为原始值。我认为这不是最佳做法。

2)我认为我想要的解决方案: 我正在寻找DAL层中的辅助函数来遍历返回对象中的所有值,并在调用SaveChanges之前仅将非空值标记为“IsModified”。

我在C#中找到了关于如何检查更改值但不是null的示例。 (无论如何,我仍然是一个vb家伙。不要讨厌。)


A)解决方案#2是一个很好的方法吗?

B)有没有人帮助我?

谢谢。

顺便说一下,到目前为止,这是我最好的尝试:(“CurrentValues”错误)

Public Overridable Function MarkEntriesModified(entity As Object)

    Dim dbEntityEntry = DbContext.Entry(entity)

    'Ensure only non-null values are inserted
    For Each [property] In dbEntityEntry.CurrentValues.PropertyNames
        If Not IsDBNull(dbEntityEntry.CurrentValues.GetValue(Of Object)([property])) Then
            dbEntityEntry.[Property]([property]).IsModified = True
        End If
    Next
    Return entity

1 个答案:

答案 0 :(得分:0)

试试这个架构。因此,如果您使用EF,那么我认为您已更新edmx并正确表示您的数据库对象。

例如:假设您要更新客户表中的客户数据

  • 创建一个Customer类。

  • 当您提取特定客户时,请获取实例 客户创建。

  • 将此实例传递给用户界面

  • 并将实例传递回Business层以保存

这样你就不会在两者之间松动任何东西。

some sample code