3

SQLiteWindows 8 Store Application. 此外,我使用 SQLite 包装器sqlite-net对数据库进行操作。

我将详细解释这一点,以便您了解我的情况。有些Model classes包含业务逻辑,例如类Location。然后是DatabaseModels从中生成数据库表的位置,例如LocationDb

我不想在每个模型类中实现基本的数据库方法,如Insert(Model model)、Update(Model model)Delete(int id)GetAllRecords()GetRecord(int id) 。相反,我想在所有模型的基类中实现这些方法。所有模型的这个基类称为ModelBase;所有数据库模型的基类是DbModelBase

对所有模型执行如下 Insert 方法没有问题:

    public int Insert(ModelBase model)
    {
        int id;
        using (var db = new SQLite.SQLiteConnection(MainApplication.DBPath))
        {
            db.Insert(model.GetDbModelFromModel());
            id = (int)SQLite3.LastInsertRowid(db.Handle);
        }
        return id;
    }

但我不知道如何使用 sqlite-net 实现其他的。我需要在特定表中找到特定的数据记录。我有一个包含 id 的模型对象。但是如何在不显式调用特定表的情况下使一种方法适用于所有模型类? 以下代码适用于单个特定数据库表...

        using (var db = new SQLite.SQLiteConnection(MainApplication.DBPath))
        {
            var queryResult = db.Table<LocationDb>().Where(l => l.Id == model.Id);
            if (queryResult.Count() == 1)
            {
                db.Update(new TeacherDb(model));
            }
        }

...但我不会写

var queryResult = db.Table<typeof(databaseModel)>().Where(t => t.Id == model.Id);
4

2 回答 2

0

为此编写一个通用函数

于 2013-04-12T21:55:27.837 回答
0

这个解决方案怎么样:

public class BaseModel<T> where T : Type
{
    protected T Id;
    /// <summary>
    /// Adds a new record to data base. It doesn't check for record existance.
    /// </summary>
    /// <returns></returns>
    protected BaseModel<T> Add() 
    {
        try
        {
            var entities = Variable.CurrentEntities;
            var dbSet = entities.Set<BaseModel<T>>();
            var result = dbSet.Add(this);
            entities.SaveChanges();
            return result;
        }
        catch (Exception exception)
        {
            LogException.HandleException(exception);
            return null;
        }
    }

    protected bool Update()
    {
        try
        {
            var entities = Variable.CurrentEntities;
            var dbSet = entities.Set<BaseModel<T>>();
            var original = dbSet.Find(this);
            entities.Entry(original).CurrentValues.SetValues(this);
            entities.SaveChanges();
            return true;
        }
        catch (Exception exception)
        {
            LogException.HandleException(exception);
            return false;
        }
    }

    protected BaseModel<T> Delete()
    {
        try
        {
            var entities = Variable.CurrentEntities;
            var dbSet = entities.Set<BaseModel<T>>();
            var result = dbSet.Remove(this);
            entities.SaveChanges();
            return result;
        }
        catch (Exception exception)
        {
            LogException.HandleException(exception);
            return null;
        }
    }

    protected bool Upsert()
    {
        try
        {
            var entities = Variable.CurrentEntities;
            var dbSet = entities.Set<BaseModel<T>>();
            dbSet.AddOrUpdate(this);
            return true;
        }
        catch (Exception exception)
        {
            LogException.HandleException(exception);
            return false;
        }
    }

    protected BaseModel<T> Save()
    {
        try
        {
            var entities = Variable.CurrentEntities;
            var dbSet = entities.Set<BaseModel<T>>();
            var original = dbSet.Find(Id);
            if (original == null)
            {
                original = dbSet.Add(this);
            }
            else
            {
                entities.Entry(original).CurrentValues.SetValues(this);
            }
            entities.SaveChanges();
            return original;
        }
        catch (Exception exception)
        {
            LogException.HandleException(exception);
            return null;
        }
    }
}
于 2017-05-31T07:06:26.823 回答