执行记录插入/更新的自定义是什么?
我在MS SQL服务器数据库中有这个Log表,还有一个C#类(示例是简化的)
[Table(Name = "dbo.Sys_Log")]
public class Sys_Log
{
// Read-only, db-generated primary key ID
private int _logID;
[Column(IsPrimaryKey=true, Storage="_logID", IsDbGenerated=true)]
public int logID
{
get
{
return this._logID;
}
}
// Read-only db-generated datetime field
private System.DateTime _logTime;
[Column(Storage="_logTime", IsDbGenerated=true)]
public System.DateTime logTime
{
get
{
return this._logTime;
}
}
// Read-write string field
private string _logEvent;
[Column(Storage="_logEvent")]
public string logEvent
{
get
{
return this._logEvent;
}
set
{
this._logEvent = value;
}
}
public Sys_Log() {}
public Sys_Log(string logEvent)
{
this.logEvent = logEvent;
}
}
这就是我添加日志条目的方式:
Table<Sys_Log> linqLog = db.GetTable<Sys_Log>();
Sys_Log l = new Sys_Log("event");
linqLog.InsertOnSubmit(l);
db.SubmitChanges();
我对这段代码并不特别满意。我喜欢这样的事情:
Sys_Log.Log("event");
我知道如何实现这一目标,但我想知道我是否遵循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();
}
我现在可以这样做:
Sys_Log.Connect(db); // Only once, at init
Sys_Log.Log("event1");
Sys_Log.Log("event2");
除了数据库多次更新这一事实之外是否存在任何陷阱,这可能被视为无效?
**************更新******************
根据@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();
}
答案 0 :(得分:1)
每次都使用新的数据上下文。重用相同的背景会带来灾难性的后果:
另请注意,L2S已被弃用,EF已取代它。
如果您真的想要,可以共享SqlConnection并长期使用它。这需要通过你处理断开的连接。由于连接池,很少有性能激励来做到这一点。
这通常是使用一次性连接的最简单,最清晰的方法。注入工厂,例如:
Func<SqlConnection> myFactory = () => new SqlConnection(myConnStr);
这就是它的全部。像往常一样使用using
:
using(var conn = myFactory()) { ... }