【问题标题】:Save same object in different tables将同一对象保存在不同的表中
【发布时间】:2016-09-02 10:51:26
【问题描述】:

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

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

在 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 无法确定要使用哪个表。如果你想说,那就是 ORM 的问题——他们必须知道哪个类型映射到哪个表。

标签: c# mysql entity-framework


【解决方案1】:

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

该方法可能类似于:

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

_commander 是 Drapper 的 IDbCommander 的一个实例。从这一点开始,您将提供 SQL 以在数据库中插入或更新项目并将该 SQL 放入您的配置中。

非常简单、非常快速、完全可测试。

【讨论】:

    【解决方案2】:

    关于使您的代码适应 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-20
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 2018-06-21
      • 1970-01-01
      相关资源
      最近更新 更多