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

时间:2016-02-04 22:45:36

标签: sql-server entity-framework breeze

我有一个Breeze Context Provider与EF 6.1.1,数据库优先,与SQL Server的应用程序交谈,我遇到了一些问题。我可以插入一条新记录,但是当我更新它时,并不是所有已更改的列都会写入数据库。

我有一个生成的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。

我无法弄清楚为什么当同时设置的“相邻”列时,此特定列不会通过。我也不知道这是一个微风问题还是一个EF问题,因为我可以回去使用EF,DBContext一切正常。

我也尝试从EDMX文件中删除该表并重新添加它无济于事。我重新验证了该列是否在EDMX文件的表中。

作为一个黑客,我要做的就是回去,直接重新阅读更改的记录,更新它,然后再发回。

任何建议都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

您可以将问题的PreSaveEntity方法和客户端实体的示例操作发布到您的问题中吗?

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

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

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

我想知道在调用saveChanges之前是否在客户端上操作了“UpdatedAt”属性,因此该属性在属性映射中已经被标识为“已修改”。

答案 1 :(得分:0)

请参阅此问题,您将得到答案。

how to secure add or delete entities with breezejs

这里有两个选项:
1.更改实际的saveMap实体而不是新实体 2.将新实体创建为“源”并将其替换为实际实体。