在不同的表中保存相同的对象

本文关键字:对象 保存 | 更新日期: 2023-09-27 18:05:14

在我的项目中,我有很多列表表(都是完全相同的结构),我存储所有下拉选项。对于每个表,我都有一个历史表来跟踪所有更改。

我想创建在主表中插入或更新记录的通用函数,并在历史表中添加新记录。

在SQLite中,我用的是

    public int SaveItem<T>(T item) where T : IMyEntity {
        lock (locker) {
            if (item.Id != 0) {
                database.Update(item);
                return item.Id;
            }
            else {
                return database.Insert(item);
            }
        }
    }

我不能对EF这样做。数据库为MySQL

在不同的表中保存相同的对象

虽然使用EF很难(或者可能不可能),但使用Drapper绝对是微不足道的。

方法可能看起来像这样:

public T Save<T> (T item) where T : IMyEntity
{
    return _commander.Execute(item) ? item : null; 
}

其中_commander是Drapper的IDbCommander的实例。从这里开始,您将提供SQL来插入或更新数据库中的项目。把SQL放到你的配置中。

非常简单,非常快,完全可测试。

关于使你的代码适应EF,如果你正在使用附加实体,这应该可以工作

public int SaveItem<T>(T item) where T : IMyEntity {
    lock (locker) {
        if (item.Id != 0) {
            context.Set(typeof(T)).Add(item);
        }
        context.SaveChanges();
        return item.Id;
    }
}