Breeze->EF6 更新了一些更改的列,但不是全部

Breeze->EF6 updating some changed columns, but not all

我有一个 Breeze 上下文提供程序与 EF 6.1.1、数据库优先、带有 SQL 服务器的应用程序对话,但我遇到了一些问题。我可以插入一条新记录,但是当我更新它时,并非所有更改的列都写入数据库。

我有一个生成的 POCO,如下所示:

public partial class Inventory
{
    public Inventory()
    {
    }

    public int Id { get; set; }
    public System.DateTime EnteredAt { get; set; }
    public string EnteredBy { get; set; }
    public string UpdatedBy { get; set; }
    public Nullable<System.DateTime> UpdatedAt { get; set; }
    public string Comment { get; set; }
}

当我在客户端更新实体(设置 Comment 属性)并将其发送给 Breeze 时,我在 EFContextProvider::BeforeSaveEntity 覆盖中做了一些非常简单的设置:

    protected override Dictionary<Type, List<EntityInfo>> BeforeSaveEntities(Dictionary<Type, List<EntityInfo>> saveMap)
    {
        // only one inventory is ever sent in
        if (saveMap.ContainsKey(typeof(Inventory)))
        {
            var source = saveMap[typeof(Inventory)].First().Entity as Inventory;

            // set up the user and time fields
            if (source.Id <= 0)
            {
                source.EnteredBy = _defaultUserName;
                source.EnteredAt = DateTime.Now;
            }
            else
            {
                source.UpdatedBy = _defaultUserName;
                source.UpdatedAt = DateTime.Now;
            }

         }
     }

但是当更改被提交时,更改的 UpdatedBy 值永远不会进入数据库。

我打开了 EF6 SQL 日志记录,果然,UPDATE 语句完全错过了 属性。

UPDATE [dbo].[Inventory]
SET [Comment] = @0, [UpdatedAt] = @1
WHERE ([Id] = @2)
-- @0: '1532' (Type = AnsiString, Size = 250)
-- @1: '2/4/2016 10:32:58 PM' (Type = DateTime2)
-- @2: '100344' (Type = Int32)
-- Executing at 2/4/2016 3:33:06 PM -07:00
-- Completed in 7 ms with result: 1

当然,对于这次更新,UpdatedBy 在数据库中为 NULL。

我不明白为什么这个特定的列不会通过而同时设置的 'adjacent' 列会通过。我也不知道这是 Breeze 问题还是 EF 问题,因为我可以返回并仅使用 EF,DBContext 一切正常。

我也试过从 EDMX 文件中删除 table 并重新添加它,但无济于事。我重新验证了该列在 EDMX 文件的 table 中。

作为hack,我要做的就是回去,直接重新读取变化的记录,更新,然后发回。

如有任何建议,我们将不胜感激。

你能post将客户端的 BeforeSaveEntity 方法和实体操作示例放入你的问题中吗?

其次,确保您在 BeforeSave 方法中为实体信息更新 属性Map,如下所示:

source.UpdatedBy = "Joe User";
source.UpdatedAt = DateTime.Now;
source.Comment = "1532";

entityInfo.OriginalValuesMap["UpdatedBy"] = null;
entityInfo.OriginalValuesMap["UpdatedAt"] = null;
entityInfo.OriginalValuesMap["Comment"] = null;

我想知道 "UpdatedAt" 属性 是否在调用 saveChanges 之前在客户端上被操纵,因此这个 属性 已经被识别为 'Modified' 属性地图。

请参考这个问题你会得到答案。

这里有两个选项:
1. 实际 saveMap 实体的变化不在新实体中。
2. 创建新实体 'source' 并将其替换为实际实体。