C# LINQ:透明记录插入和更新
执行记录插入/更新时的自定义数据是什么 我在MS SQL server数据库中有这个日志表,还有一个C#类(示例已简化) 下面是我添加日志项的方式:C# LINQ:透明记录插入和更新,c#,linq,C#,Linq,执行记录插入/更新时的自定义数据是什么 我在MS SQL server数据库中有这个日志表,还有一个C#类(示例已简化) 下面是我添加日志项的方式: Table<Sys_Log> linqLog = db.GetTable<Sys_Log>(); Sys_Log l = new Sys_Log("event"); linqLog.InsertOnSubmit(l); db.SubmitChanges(); 我知道如何实现这一点,但我想知道我是否遵循LINQ哲学。将此代码
Table<Sys_Log> linqLog = db.GetTable<Sys_Log>();
Sys_Log l = new Sys_Log("event");
linqLog.InsertOnSubmit(l);
db.SubmitChanges();
我知道如何实现这一点,但我想知道我是否遵循LINQ哲学。将此代码添加到Sys_Log类
private static DataContext db;
public static void Connect(DataContext db)
{
Sys_Log.db = db;
}
public static void Log(string logEvent)
{
Table<Sys_Log> linqLog = db.GetTable<Sys_Log>();
Sys_Log l = new Sys_Log(logEvent);
linqLog.InsertOnSubmit(l);
db.SubmitChanges();
}
除了数据库被多次更新之外,是否存在任何可能被视为无效的缺陷
**************更新******************
按照@usr关于不要重用DataContext对象的建议,我对Sys_Log类进行了以下更改:
private static SqlConnection db;
public static void Connect(SqlConnection db)
{
Sys_Log.db = db;
}
public static void Log(string logEvent)
{
DataContext ctx = new DataContext(db);
ctx.CommandTimeout = 240;
Table<Sys_Log> linqLog = ctx.GetTable<Sys_Log>();
Sys_Log l = new Sys_Log(logEvent);
linqLog.InsertOnSubmit(l);
ctx.SubmitChanges();
}
私有静态SqlConnection数据库;
公共静态void Connect(SqlConnection db)
{
Sys_Log.db=db;
}
公共静态无效日志(字符串日志事件)
{
DataContext ctx=新的DataContext(db);
ctx.CommandTimeout=240;
表linqLog=ctx.GetTable();
系统日志l=新的系统日志(logEvent);
linqLog.InsertOnSubmit(l);
ctx.SubmitChanges();
}
每次使用新的数据上下文。重复使用相同的上下文会带来灾难性的后果:
Func<SqlConnection> myFactory = () => new SqlConnection(myConnStr);
谢谢,我已经把你的建议写在我的帖子里了。我会注意到你关于EF取代L2S的评论,但是由于项目的其余部分都在使用L2S,现在我将坚持使用L2S。这是合理的。我现在有100 KLoC卡在L2S上,因为EF在LINQ转换时仍然没有达到标准。哦,看那个代码,你不应该重用Sql连接。它可能会崩溃,也可能导致应用程序永久关闭。插入一个连接工厂,可能是一个
Func
。您能给我指一些说明如何实现这种连接工厂的参考资料吗?我有点不知所措,在共享SqlConnection对象时我应该是多么偏执。为每个事务实例化,并在事务结束后关闭,这感觉有些过分。请把它添加到你的答案中,这样我就可以接受它,从而使这个话题平静下来。我已经做了一些编辑。这是创建工厂的一种非常简单的方法。
Sys_Log.Connect(db); // Only once, at init
Sys_Log.Log("event1");
Sys_Log.Log("event2");
private static SqlConnection db;
public static void Connect(SqlConnection db)
{
Sys_Log.db = db;
}
public static void Log(string logEvent)
{
DataContext ctx = new DataContext(db);
ctx.CommandTimeout = 240;
Table<Sys_Log> linqLog = ctx.GetTable<Sys_Log>();
Sys_Log l = new Sys_Log(logEvent);
linqLog.InsertOnSubmit(l);
ctx.SubmitChanges();
}
Func<SqlConnection> myFactory = () => new SqlConnection(myConnStr);
using(var conn = myFactory()) { ... }