Dapper.Contrib AS 实体,为什么会失败?
Dapper.Contrib AS Entity, Why it fails?
我计划将 Contrib 与 dapper 一起使用,使我的 class 桌面应用程序看起来像这样
public abstract class DB : IDisposable
{
public virtual long Insert()
{
using (var db = ConFactory.GetConnection())
{
db.Open();
return db.Insert(this);
}
}
// ... and other CRUD operations
}
那么任何概念 class 都将从 DB class 继承;像这样
[Table("test")]
public class Test : DB
{
[Key]
public int TestId { get; set; }
public string Name { get; set; }
}
使用测试 class
using (Test t = new Test { Name = textBox2.Text })
{
textBox1.Text = t.Insert().ToString();
}
这个示例总是失败并给我
SQL logic error near ")": syntax error
但是 当我在子 class 中实现 Insert()
方法时效果很好!!!
问题是:我的代码包含很多 classes,重写所有 CUD 操作非常令人不安,
有什么想法可以用更少的代码解决这个问题吗?
我想出了一个更好的方法来解决这个问题...我认为它更灵活,也更专业。
我会把解决方案放在这里...很快 github
基于Extension方法的解决方案,只用概念classes注入CUD操作我提出了IDbTable
基础class
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);
}
}
}
好的,就这些了
当任何class继承自IDbTable
基础class时,它有插入、更新和删除方法作为扩展
[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();
而且效果很好!!!
如有任何改进建议,我们将不胜感激。
我计划将 Contrib 与 dapper 一起使用,使我的 class 桌面应用程序看起来像这样
public abstract class DB : IDisposable
{
public virtual long Insert()
{
using (var db = ConFactory.GetConnection())
{
db.Open();
return db.Insert(this);
}
}
// ... and other CRUD operations
}
那么任何概念 class 都将从 DB class 继承;像这样
[Table("test")]
public class Test : DB
{
[Key]
public int TestId { get; set; }
public string Name { get; set; }
}
使用测试 class
using (Test t = new Test { Name = textBox2.Text })
{
textBox1.Text = t.Insert().ToString();
}
这个示例总是失败并给我
SQL logic error near ")": syntax error
但是 当我在子 class 中实现 Insert()
方法时效果很好!!!
问题是:我的代码包含很多 classes,重写所有 CUD 操作非常令人不安,
有什么想法可以用更少的代码解决这个问题吗?
我想出了一个更好的方法来解决这个问题...我认为它更灵活,也更专业。 我会把解决方案放在这里...很快 github
基于Extension方法的解决方案,只用概念classes注入CUD操作我提出了IDbTable
基础class
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);
}
}
}
好的,就这些了
当任何class继承自IDbTable
基础class时,它有插入、更新和删除方法作为扩展
[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();
而且效果很好!!!
如有任何改进建议,我们将不胜感激。