C# WCF数据服务/实体框架:日志客户端';s用户名、身份验证、授权
我将实体框架与WCF数据服务一起使用,我的数据库中有下表: 表格合同C# WCF数据服务/实体框架:日志客户端';s用户名、身份验证、授权,c#,.net,wpf,entity-framework,wcf-data-services,C#,.net,Wpf,Entity Framework,Wcf Data Services,我将实体框架与WCF数据服务一起使用,我的数据库中有下表: 表格合同 Id(int) 名称(varchar) 按用户(varchar) isDeleted(位) 实体框架类 Id(int) 名称(字符串) 按用户(字符串) isDeleted(布尔值) 每当用户(通过客户端应用程序)插入/更新/删除合同时,我都需要记录是谁执行了该操作 因此,我为insert/update/delete创建了存储过程,当执行插入/删除/更新时,它将从客户端接收用户名 问题在于删除操作没有发送执行该操作的人
- Id(int)
- 名称(varchar)
- 按用户(varchar)
- isDeleted(位)
- Id(int)
- 名称(字符串)
- 按用户(字符串)
- isDeleted(布尔值)
var ctx = Context;
var contractToDelete = ctx.Contracts.Where(c => c.ContractId == 1).First();
contractToDelete.ByUser = username;
ctx.DeleteObject(contractToDelete);
ctx.SaveChanges();
在服务器端,byUser总是空的
问题:
1) 如何将byUser参数发送到服务器
2) 有没有更好的方法来处理这种情况?(日志记录/身份验证/授权)使用实体框架我的管理方式是,当我的用户登录时,我将他们的基本信息存储在会话中。然后,我有一个类,它位于我的动作到上下文的顶部 每当我提交回更改时,我都会执行相同的例行程序来检查更改的内容。我开发了基于与之合作的实体触发操作的能力(因此我可以关注合同之类的东西)。然后我就可以登录用户了 [编辑] 这比我意识到的更难澄清,但我会努力的 我正在创建一个web应用程序。大量使用Ninject 当用户登录时,我将他们的信息存储在一个IUserSession对象中(这实际上是在会话中保存的,但是定制的Ninject作用域使这对我来说很整洁,并防止我必须向Web会话公开数据层)。此用户会话对象包含用户名、用户id等 我创建了一个包含上下文的类,并包装了所有SELECT、CREATE、DELETE和COMMIT调用。i、 e.选择
public IQueryable<TEntity> All<TEntity>( ) {
return Context.Set<TEntity>();
}
我确实计划很快写一篇教程,以我的个人经验为基础(现在对你没有帮助)。它不会发送空的“总是”。它总是发送旧值。这是实体框架中的一些内部逻辑。对于每个跟踪对象,EF保留原始值和当前值。当您删除对象时,EF不使用当前值-它使用原始值(不要问我为什么,它就是这样工作的)
所以你需要欺骗EF:
var ctx = Context;
var contractToDelete = ctx.Contracts.Where(c => c.ContractId == 1).First();
contractToDelete.ByUser = username;
ctx.Contracts.ApplyOriginalValues(contractToDelete);
ctx.DeleteObject(contractToDelete);
ctx.SaveChanges();
调用ApplyOriginalValues
将强制EF使用传入参数的值覆盖原始值=您将使用当前值覆盖原始值
在我看来,更好的方法是将删除的记录存储在单独的表中,因为这样可以避免将
isDeleted=false
传递到每个查询时出现的许多问题,在这些查询中,即时加载和延迟加载都会加载删除的记录。避免问题的唯一方法是删除是使用条件映射,但在这种情况下,除非使用存储过程或直接SQL查询,否则即使您想加载已删除的记录,您也无法加载这些记录。这是windows、asp.net、wpf应用程序吗?您如何为username
变量赋值?这是一个WPF应用程序。当用户登录时,他通过login box.thx提供用户名和密码作为答案。但是如何存储会话信息?那么位于上下文操作之上的类呢?你能提供一些代码示例吗?我实在想不起来了。现在我明白为什么了。我正在使用WCF数据服务,因此在ctx.Contracts中没有任何ApplyOriginalValues方法。还有其他方法吗?使用WCF数据服务是非常重要的信息,您的问题中缺少这些信息。有了数据服务,它的行为会完全不同。哦,很抱歉。我现在正在纠正这个问题。
var ctx = Context;
var contractToDelete = ctx.Contracts.Where(c => c.ContractId == 1).First();
contractToDelete.ByUser = username;
ctx.Contracts.ApplyOriginalValues(contractToDelete);
ctx.DeleteObject(contractToDelete);
ctx.SaveChanges();