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' 并将其替换为实际实体。
我有一个 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' 并将其替换为实际实体。