LINQ:透明记录插入和更新

时间:2015-06-16 11:30:41

标签: c# linq

执行记录插入/更新的自定义是什么?

我在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();
}

1 个答案:

答案 0 :(得分:1)

每次都使用新的数据上下文。重用相同的背景会带来灾难性的后果:

  1. 未发布任何实体内存
  2. 当一个无效的实体进入上下文时(由于一个错误),它会被卡住并永远阻止SubmitChanges成功。应用程序永远不会恢复
  3. 另请注意,L2S已被弃用,EF已取代它。

    如果您真的想要,可以共享SqlConnection并长期使用它。这需要通过你处理断开的连接。由于连接池,很少有性能激励来做到这一点。

    这通常是使用一次性连接的最简单,最清晰的方法。注入工厂,例如:

    Func<SqlConnection> myFactory = () => new SqlConnection(myConnStr);
    

    这就是它的全部。像往常一样使用using

    using(var conn = myFactory()) { ... }