我打算将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; }
}
使用Test class
using (Test t = new Test { Name = textBox2.Text })
{
textBox1.Text = t.Insert().ToString();
}
这个样本总是失败并给我
“)”附近的SQL逻辑错误:语法错误
但是当我在子类中实现Insert()
方法时,它运行良好!
问题是:我的代码包含很多类,重写所有CUD操作都是如此令人不安,
用更少的代码来解决这个问题的任何想法?
答案 0 :(得分:0)
我找到了解决这个问题的更好方法......我认为这更灵活,更专业。 我将解决方案放在这里......很快就会出现在github上
基于Extension方法的解决方案,只使用我提出的概念类注入CUD操作IDbTable
基类
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
基类时,它具有insert,update和delete方法作为extenssion
[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();
它工作得很好!!!
任何有待改进的建议都将受到赞赏。