小编Bir*_*iri的帖子

使用Entity Framework记录每个数据更改

客户需要将每个数据更改记录到与进行修改的实际用户的日志记录表中.应用程序使用一个SQL用户来访问数据库,但我们需要记录"真实"用户ID.

我们可以在t-sql中通过为每个表插入和更新编写触发器,并使用context_info来存储用户ID来完成此操作.我们将用户标识传递给存储过程,将用户标识存储在contextinfo中,触发器可以使用此信息将日志行写入日志表.

我无法找到使用EF在哪里或如何做类似的地方或方式.所以主要目标是:如果我通过EF对数据进行更改,我想以半自动的方式将确切的数据更改记录到表中(因此我不想在每个字段之前检查更改)保存对象).我们正在使用EntitySQL.

不幸的是,我们必须坚持SQL 2000,因此SQL2008中引入的数据更改捕获不是一个选项(但也许这对我们来说也不是正确的方法).

任何想法,链接或起点?

[编辑] 一些注意事项:通过使用ObjectContext.SavingChanges事件处理程序,我可以得到我可以注入SQL语句来初始化contextinfo的点.但是我不能混合使用EF和标准SQL.所以我可以获得EntityConnection但我无法使用它执行T-SQL语句.或者我可以获取EntityConnection的连接字符串并基于它创建一个SqlConnection,但它将是一个不同的连接,因此contextinfo不会影响EF的保存.

我在SavingChanges处理程序中尝试了以下内容:

testEntities te = (testEntities)sender;
DbConnection dc = te.Connection;
DbCommand dcc = dc.CreateCommand();
dcc.CommandType = CommandType.StoredProcedure;
DbParameter dp = new EntityParameter();
dp.ParameterName = "userid";
dp.Value = textBox1.Text;
dcc.CommandText = "userinit";
dcc.Parameters.Add(dp);
dcc.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

错误:EntityCommand.CommandText的值对StoredProcedure命令无效.与SqlParameter相同而不是EntityParameter:SqlParameter不能使用.

StringBuilder cStr = new StringBuilder("declare @tx char(50); set @tx='");
cStr.Append(textBox1.Text);
cStr.Append("'; declare @m binary(128); set @m = cast(@tx as binary(128)); set context_info @m;");

testEntities te = (testEntities)sender;
DbConnection dc = te.Connection;
DbCommand dcc = dc.CreateCommand();
dcc.CommandType = CommandType.Text;
dcc.CommandText …
Run Code Online (Sandbox Code Playgroud)

logging entity-framework

29
推荐指数
3
解决办法
2万
查看次数

带有计时器的.NET Windows服务停止响应

我有一个用c#编写的Windows服务.它内部有一个计时器,可以定期激活一些功能.所以我服务的骨架:

public partial class ArchiveService : ServiceBase
{
    Timer tickTack;
    int interval = 10;
    ...

    protected override void OnStart(string[] args)
    {
        tickTack = new Timer(1000 * interval);

        tickTack.Elapsed += new ElapsedEventHandler(tickTack_Elapsed);
        tickTack.Start();
    }

    protected override void OnStop()
    {            
        tickTack.Stop();
    }    

    private void tickTack_Elapsed(object sender, ElapsedEventArgs e)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作了一段时间(如10-15天)然后停止.我的意思是服务显示为正在运行,但它没有做任何事情.我做了一些日志记录,问题可能是计时器,因为在间隔之后它不会调用tickTack_Elapsed函数.

我正在考虑在没有计时器的情况下使用无限循环重写它,这会在我设置的时间内停止处理.这也不是一个优雅的解决方案,我认为它可能会对内存产生一些副作用.

Timer是从System.Timers命名空间使用的,环境是Windows 2003.我在不同服务器上的两个不同服务中使用这种方法,但两者都产生了这种行为(这就是为什么我认为它以某种方式连接到我的代码或框架本身).

有人经历过这种行为吗?有什么不对?


编辑:

我编辑了这两项服务.一个人到处都有一个不错的尝试和更多的记录.第二个定期进行定时娱乐.他们都没有停止过,所以如果这种情况再持续一周,我会关闭这个问题.到目前为止,感谢大家.


编辑:

我关闭了这个问题因为什么都没发生 我的意思是我做了一些更改,但这些更改在这个问题上并不真正相关,而且从那时起这两个服务都没有任何问题.请将其标记为"已关闭且不再相关".

c# windows-services timer

18
推荐指数
3
解决办法
1万
查看次数

更改用户登录名后的身份验证错误

我们有一位最近更名的用户.

假设旧用户名是old.name,新用户名是new.name.

在使用新用户名编辑AD和logout/login中的详细信息后,我们的ASP.NET应用程序将显示旧名称.

使用Windows身份验证的纯ASP.NET,没有MVC.

获取用户名的代码是:

WindowsPrincipal wp = (WindowsPrincipal)HttpContext.Current.User;
String userName = wp.Identity.Name.Substring(wp.Identity.Name.IndexOf("\\") + 1);
Run Code Online (Sandbox Code Playgroud)

这将返回old.name,而不是new.name.

我检查了IIS日志文件,这些文件显示了新名称:

2011-04-05 11:41:44 W3SVC1 MARS 10.57.1.64 GET /eft/Default.aspx - 80 - 10.57.0.161 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+5.2;+Trident/4.0;+.NET+CLR+1.1.4322;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.4506.2152;+.NET+CLR+3.5.30729;+.NET4.0C;+.NET4.0E) 401 2 2148074254

2011-04-05 11:41:44 W3SVC1 MARS 10.57.1.64 GET /eft/Default.aspx - 80 SANOMABP\new.name 10.57.0.161 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+5.2;+Trident/4.0;+.NET+CLR+1.1.4322;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.4506.2152;+.NET+CLR+3.5.30729;+.NET4.0C;+.NET4.0E) 200 0 0
Run Code Online (Sandbox Code Playgroud)

我们已经重新启动了应用程序池,我们检查了AD数据,而且我们没有更多想法可能出错.

asp.net windows-authentication

17
推荐指数
1
解决办法
7143
查看次数

使用多行无法使正则表达式正常工作

我有一个来自应用程序的非常大的XML输出.我需要使用我的程序处理它,然后将其反馈给原始程序.这个XML中的部分需要填写我们的替换.有趣的部分看起来像这样:

<sys:customtag sys:sid="1" sys:type="Processtart" />
    <sys:tag>value</sys:tag>
    here are some other tags
    <sys:tag>value</sys.tag>
<sys:customtag sys:sid="1" sys:type="Procesend" />
Run Code Online (Sandbox Code Playgroud)

并且该文档包含几个这样的部分.

我需要在这些标记内部获取所有XML部分才能对其进行修改.我写了一个正则表达式来获取这些碎片,但它不起作用:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"output.xml");
Regex regExp = new Regex(@"<sys:customtag(.*?)Processtart(.*?)/>(.*?)<sys:customtag (.*?)Procesend(.*?)/>", RegexOptions.Multiline & RegexOptions.IgnorePatternWhitespace & RegexOptions.CultureInvariant);
MatchCollection matches = regExp.Matches(xmlDoc.InnerXml);
Run Code Online (Sandbox Code Playgroud)

如果我将所有内容放在一行中并在没有多行选项的情况下调用此正则表达式,它确实会发现每个出现的情况.通过保留文件并设置多行选项,它不起作用.有什么问题,我应该改变什么?或者有没有更容易的方法来获得这些标签之间的XML部分没有正则表达式?

c# regex multiline

15
推荐指数
2
解决办法
2万
查看次数

Webforms和jQuery,如何匹配ID?

我想在asp.net webfoms中使用jQuery.我是否需要获得一个特殊的工具包,以便.net控件吐出友好的控件ID?

原因是,我不想写javascript引用我的HTML ID,如control_123_asdfcontrol_234.

这是否已在3.5版中解决?(我记得读过你必须得到一些让ID友好的特殊dll).

asp.net jquery web-controls

11
推荐指数
2
解决办法
8647
查看次数

在Entity Framework中更新数据库模式

我安装了VS SP1并使用了Entity Framework.

我从现有数据库创建了一个模式,并尝试了一些基本操作.

除数据库架构更新外,其中大部分都进​​展顺利.

我以各种基本方式更改了数据库:

  • 添加了一张新表
  • 删除了一张桌子
  • 在现有表中添加了一个新列
  • 从现有表中删除了一列
  • 更改了现有列的类型

前三个进展顺利,但类型更改和列删除没有遵循数据库更改.

有没有办法让设计师工作?或者目前不支持?我还没有找到任何相关材料,但仍在寻找.

.net schema entity-framework

8
推荐指数
2
解决办法
2万
查看次数

ASP.NET的登录控件问题

我设置了一个网站,使用SqlMembershipProvider编写本页面.

我跟着每一步.我有数据库,我修改了Web.config以使用此提供程序,使用正确的连接字符串,并将身份验证模式设置为Forms.创建了一些用户进行测试.

我创建了一个Login.aspx并将Login控件放在上面.一切正常,直到用户可以登录.

我调用Default.aspx,它被重定向到Login.aspx,我输入用户和正确的密码.没有错误信息,似乎没有错,但我再次看到登录表单,输入用户的登录信息.但是,如果我在浏览器中检查cookie,我会看到存在具有指定名称的cookie.

我已经尝试自己处理这些事件并检查它们发生了什么,但没有成功.

我正在使用VS2008,文件系统中的网站,SQL Express 2005存储aspnetdb,没有角色管理,经过K-Meleon,IE7.0和Chrome测试.

有任何想法吗?

解决方案:在与Rob进行一些邮寄后,我们有了理想的解决方案,现在已经接受了答案.

asp.net

6
推荐指数
2
解决办法
1万
查看次数

并行处理数据库队列

有一个小系统,其中数据库表作为MSSQL 2005上的队列.一些应用程序正在写入此表,一个应用程序正在以FIFO方式读取和处理.

我必须使它更先进,以便能够创建一个分布式系统,其中可以运行多个处理应用程序.结果应该是2-10处理应用程序应该能够运行并且它们在工作期间不应该相互干扰.

我的想法是扩展队列表,其中一行显示进程已在处理它.处理应用程序将首先使用idetifyer更新表,然后请求更新的记录.

所以像这样:

start transaction
update top(10) queue set processing = 'myid' where processing is null
select * from processing where processing = 'myid'
end transaction
Run Code Online (Sandbox Code Playgroud)

在处理之后,它将表的处理列设置为其他内容,例如"完成"或其他任何内容.

关于这种方法,我有三个问题.

第一:这可以用这种形式吗?

第二:如果它有效,它是否有效?你有什么其他想法来创建这样的发行版吗?

第三:在MSSQL中,锁定是基于行的,但是在锁定了一定数量的行之后,锁定会扩展到整个表.因此,在第一个应用程序未释放事务之前,第二个应用程序无法访问它.选择有多大(顶部x)以便不锁定整个表,只创建行锁?

c# sql-server-2005 distributed-system

4
推荐指数
1
解决办法
3042
查看次数