C# LINQ:透明记录插入和更新

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哲学。将此代码

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

我在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哲学。将此代码添加到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();
}

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

  • 没有实体内存被释放
  • 当一个无效实体进入上下文时(由于一个bug),它将被卡住,并将永远阻止提交更改的成功。应用程序将永远无法恢复
  • 还请注意,L2S已被弃用,EF已取代它

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

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

    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()) { ... }