CodeFluentEntityState 保持不变

CodeFluentEntityState remains Unchanged

我有一个具有以下配置的实体:

  <cf:entity name="Statistic" _fr:fastReader="true" setType="List" concurrencyMode="None" trackingModes="None" namespace="Runtime" categoryPath="/Compareware" persistenceName="Statistic">
<cf:property name="Date" trackingModes="None" key="true" typeName="date" />
<cf:property name="ResultViews" trackingModes="None" typeName="short" />
<cf:property name="Position" cfps:size="8,4" cfps:dataType="numeric" xmlns:cfps="http://www.softfluent.com/codefluent/producers.sqlserver/2005/1" trackingModes="None" typeName="float" />
<cf:property name="Detailviews" trackingModes="None" typeName="short" />
<cf:property name="Clicks" trackingModes="None" typeName="short" />
<cf:property name="CostTotalExclVat" cfps:size="8,2" cfps:dataType="numeric" xmlns:cfps="http://www.softfluent.com/codefluent/producers.sqlserver/2005/1" trackingModes="None" typeName="decimal" />
<cf:property name="SiteGuid" trackingModes="None" typeName="guid" />
<cf:property name="FormsSent" defaultValue="0" trackingModes="None" typeName="short" />
<cf:property name="FormsAccepted" trackingModes="None" typeName="short" />
<cf:property name="ObjectGuid" trackingModes="None" key="true" />
<cf:property name="Reveals" trackingModes="None" typeName="short" />
<cf:property name="ClusterAccountGuid" trackingModes="None" typeName="guid" />
<cf:property name="EndDate" trackingModes="None" typeName="date" />
<cf:property name="FormsSentNeedingAcceptance" trackingModes="None" typeName="short" />
<cf:property name="ClusterGuid" typeName="guid" />
<cf:method name="LoadBySiteClusterAccountAndDateSpan" body="LOAD ( SiteGuid, ClusterAccountGuid, Datetime DateFrom, Datetime DateTo) WHERE Date &gt;= @DateFrom AND Date &lt;= @DateTo AND ClusterAccountGuid = @ClusterAccountGuid AND SiteGuid=@SiteGuid  ORDER BY Siteguid ASC, Date ASC" />
<cf:method name="LoadBySiteClusterAccountAndDate" body="LOADONE (SiteGuid, ClusterAccountGuid, date) WHERE ClusterAccountGuid = @ClusterAccountGuid AND SiteGuid =@SiteGuid AND Date = @date" />
<cf:method name="LoadByUserAndDateSpan" body="LOAD (ClusterAccountGuid, Datetime DateFrom, Datetime DateTo) WHERE Date &gt;= @DateFrom AND Date &lt;= @DateTo AND ClusterAccountGuid = @ClusterAccountGuid ORDER BY Date ASC" />
<cf:method name="LoadByObjectAndDateSpan" body="LOAD(ObjectGuid, Datetime DateFrom, Datetime DateTo) WHERE Date &gt;= @DateFrom AND Date &lt;= @DateTo AND  ObjectGuid  = @ObjectGuid ORDER BY Date ASC" />
<cf:method name="LoadByObjectAndDate" body="LOADONE (ObjectGuid,Date ) WHERE Date =@Date AND ObjectGuid = @ObjectGuid" />
<cf:method name="LoadByCwSiteCluster" body="LOAD (ClusterGuid) WHERE ClusterGuid = @ClusterGuid" />

当我设置现有项目的 'CostTotalExclVat' 时,CodeFluentEntityState 保持 'Unchanged',因此它不会保存更改。它可能与'trackingModes'有关。但我不知道正确的设置。我不需要任何并发检查或 _lastSave 等。我做错了什么?

原因肯定是你在这个属性级别设置的trackingMode="none"。如果您仅更改此 属性,则在调用保存时,实体将被视为未更改。

并发检查在实体级别完成,而不是 属性 级别。因此,如果您不希望进行并发检查(比较保存时自动设置的 Rowversion,在加载和保存之间保存实体的其他内容)实体级别的相关设置是 属性 concurrencyModedefault 值为 "optimistic" 以在加载和保存之间完成更改时引发 ConcurrencyException。您可以将其设置为 None(就像您所做的那样),以确保没有例外并允许对此实体进行任何保存。 如果您需要对给定的 属性 而不是其他人进行非常具体的管理,同时在实体级别使用默认并发,您可以使用例如:

  • 此 属性 上的特定 OnAfterSet 规则(请参阅 Property EventRules)以为此 属性 [=12= 设置 "dirty" 标志]

  • 和一个 OnBeforeSave 方法,仅使用 Rowversion 调用 Reload,以防万一 属性 发生更改(参见 Concurrency Modes

最后:提到的“_lastSave”。如果您指的是数据库中的自动跟踪列“[_trackLastWriteTime/User]”。它也是一个实体级别的功能。默认情况下,它是在数据库中有更新时写入的。它与给定的 属性 无关。如果您不想在该实体的数据库中包含这些信息,您可以更改实体 Level Tracking Modes 属性,该属性默认设置为 Time/User 和 /CreationState ( “[_tracCreationTime/User]”) 到 None.