繁体   English   中英

LINQ:透明记录插入和更新

[英]LINQ: transparent record inserting and updating

记录插入/更新的习惯是什么?

我在 MS SQL 服务器数据库中有这个日志表,还有一个 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. 没有实体内存被释放
  2. 当无效实体进入上下文时(由于错误),它会被卡住并且将永远阻止 SubmitChanges 成功。 应用程序永远不会恢复

另请注意,L2S 已弃用,EF 已取代它。

如果您真的需要,您可以共享 SqlConnection 并长期使用它。 这需要您处理断开的连接。 多亏了连接池,几乎没有什么性能激励可以做到这一点。

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

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

这里的所有都是它的。 像往常一样使用它using

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM