繁体   English   中英

DAL更新特定字段

[英]DAL update specific field

我正在为Web应用程序设计DAL.dll。 该方案是在Web用户上获取实体并修改一些字段,然后单击“保存”。 我的问题是如何确保仅保存modifield字段。 例如,一个实体:

public class POCO{
    public int POCOID {get;set;}
    public string StringField {get;set;}
    public int IntField {get;set;}
}

和我的更新界面

//rows affected
int update (POCO entity);

当仅修改IntField时,因为StringField为null,所以我可以忽略它。 但是,当只有StringField是modifield时,因为IntField为0-default(int),所以我无法确定是否应忽略它。

一些限制:1.无状态,无会话。 因此不能使用“获取并更新”,上下文等。2.与数据模型一致,不能使用可为空的“ int?”

提示:如果您的业务要求中不允许使用负数,则可以使用-1表示此值不适用。

选项


许多ORM(对象关系映射)都提供这种类型的功能。 您可以定义要使用“ Entity Framework”或“ NHibernate”的对象。 这些ORM负责读取和写入数据库。 在内部,他们有自己的机制来跟踪已修改的内容。


查看Delta <\\ T> (现在这是一个ODATA事物,因此它可能没有用,但您可以从中学习)


自己做。 具有所有其他对象都继承的某种类型的基类,并且在设置字段时以某种方式将其记录在其他位置。


我强烈建议不要依赖空数或幻数(-1)来跟踪此情况。 您将为自己制造一场噩梦。

我不太了解您要如何在无状态下工作,而是仅更新已更改的属性。 当您处于无状态时,它将永远无法工作,因为您需要进行前后比较,或者需要其他任何方式来跟踪更改(例如属性设置器上的事件)。 特殊的“原始”值不是一个好的解决方案,因为我认为您的用户希望看到实际的IntField值。

另外,还要使数据库与应用程序数据一致-如果您具有标准的,不可为空的int值,请将DB列int不为null缺省为0 拥有无法由程序表示的数据库值确实很痛苦,因此软件“神奇地”将DB null设置为0。如果您的应用程序中有一个不可为null的int,则无法区分DB null和零之间,或者您必须添加一个属性,如bool IsIntFieldNull (不好!)。

为了引用通用的对象关系映射器NHibernate:它具有一个称为“动态更新”的选项,其中仅更新了更改的属性/列。 但是,这需要先后检查和有状态会话,并且是否在提高性能方面存在争议,因为每次发送相同的数据库查询(具有不同的参数值)比发送多个不同的查询要好-相对于不必要的更新和网络负载。 默认情况下,NHibernate在检查是否进行了任何更改后会更新整行。 如果只有ID,StringField和IntField,则动态更新而不是全行更新实际上可能是一个好的解决方案。

在实现NHibernate时,将可为空的DB列映射到不可为空的应用程序数据类型(例如int)是一个常见的错误,因为它会创建自动更改的DAL对象。

但是,在使用ORM或编写自己的DAL时,请确保您具有适当的数据库知识!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM