我有一个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文件的表中。
作为一个黑客,我要做的就是回去,直接重新阅读更改的记录,更新它,然后再发回。
任何建议都将受到赞赏。
答案 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.将新实体创建为“源”并将其替换为实际实体。