1

我计划将 Contrib 与 dapper 一起使用,使我在桌面应用程序中的类看起来像这样

public abstract class DB : IDisposable
{
    public virtual long Insert()
    {
        using (var db = ConFactory.GetConnection())
        {
            db.Open();
            return db.Insert(this);
        }
    }
// ... and other CRUD operations 
}

那么任何 Concept 类都将继承自 DB 类;像这样

[Table("test")]
public class Test : DB
{
    [Key]
    public int TestId { get; set; }
    public string Name { get; set; } 
}

使用测试类

using (Test t = new Test { Name = textBox2.Text })
{
    textBox1.Text = t.Insert().ToString();
}

这个样本总是失败并给了我

“)”附近的 SQL 逻辑错误:语法错误

但是当我Insert()在子类中实现方法时效果很好!问题是:我的代码包含很多类,重写所有 CUD 操作是如此令人不安,有什么想法可以用更少的代码解决这个问题吗?

4

1 回答 1

0

我想出了一个更好的方法来解决这个问题......我认为它更灵活,更专业。我会把解决方案放在这里......很快就会在github上

基于扩展方法的解决方案,仅使用我提出的IDbTable基类的概念类注入 CUD 操作

public abstract class IDbTable : IDisposable
{
    public void Dispose()
    {
        // do disposing if you need
    }
}

public static class DB
{
    public static long Insert<T>(this T entity) where T : IDbTable
    {
        using (var db = ConFactory.GetConnection())
        {
                db.Open();
                return db.Insert(entity);
        }
    }
    public static void Delete<T>(this T entity) where T : IDbTable
    {
            using (var db = ConFactory.GetConnection())
            {
                db.Open();
                db.Delete(entity);
            }
    }
    public static void Update<T>(this T entity) where T : IDbTable
    {
            using (var db = ConFactory.GetConnection())
            {
                db.Open();
                SqlMapperExtensions.Update(db, entity);
            }
    }

    public static T Get<T>(int id)
    {
        using (var db = ConFactory.GetConnection())
        {
            db.Open();
            return db.Get<T>(id);
        }
    }
}

好的,这就是全部

当任何类从IDbTable基类继承时,它都有插入、更新和删除方法作为扩展

[Table("test")]
public class Test : IDbTable
{
    [Key]
    public int TestId { get; set; }
    public string Name { get; set; }
}

…………

Test t = new Test { Name = textBox2.Text };
textBox1.Text = t.Insert().ToString();

它工作正常!

任何改进的建议将不胜感激。

于 2018-03-22T22:52:34.577 回答