C# WCF数据服务/实体框架:日志客户端';s用户名、身份验证、授权

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创建了存储过程,当执行插入/删除/更新时,它将从客户端接收用户名 问题在于删除操作没有发送执行该操作的人

我将实体框架与WCF数据服务一起使用,我的数据库中有下表:

表格合同
  • Id(int)
  • 名称(varchar)
  • 按用户(varchar)
  • isDeleted(位)
实体框架类
  • Id(int)
  • 名称(字符串)
  • 按用户(字符串)
  • isDeleted(布尔值)
每当用户(通过客户端应用程序)插入/更新/删除合同时,我都需要记录是谁执行了该操作

因此,我为insert/update/delete创建了存储过程,当执行插入/删除/更新时,它将从客户端接收用户名

问题在于删除操作没有发送执行该操作的人员:

        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();