给你举个Linq to SQL应用的例子:假设要查询一个LogName=="1234"的User对象,并且将他的Email修改一下,并保存,就可以写代码:using(var dbt=new DataContext(this.connectionString)) { var u=dbt.GetTable<User>().Where(u=>u.LogName=="1234").First(); u.Email="[email protected]"; dbt.SubmitChanges(); }这样,Linq to SQL可以处理任意自定义类型。我只需要手写这个User类型上的Attribute声明: [Table] public class User { private static Random Rnd = new Random(); private long _ID = long.MinValue; [Column(IsPrimaryKey=true)] public long ID { get { if (_ID == long.MinValue) _ID = (long)Rnd.Next() + DateTime.Now.Ticks; return _ID; } set { _ID = value; } } private string _LogName; [Column(DbType="nvarchar(40) NOT NULL")] public string LogName { get { return _LogName; } set { _LogName = value; } } [Column(DbType = "varbinary(32) NULL")] private byte[] PasswordMD5 { set; get; } private string _EMail; [Column(DbType = "nvarchar(100) NOT NULL")] public string EMail { get { return _EMail; } set { _EMail = value; } } [Column(DbType = "bit NOT NULL")] public bool DenyLogin { get; set; } 尽管大多数Linq to SQL的网上教程都教你在vs环境帮助下自动产生 .dbml 文件并自动产生相应的从 DataContext继承的数据源对象的方法,其实根本不需要,像这样仅仅在自定义的实体对象上定义相应的Attribute就可以使用Linq to SQL直接访问数据库了。Linq to SQL框架设计开发在先,然后你才使用它来编写你的数据库应用程序。这就是最关键的需求——对象的类型、属性等等都是在开发框架时预先不知道、无法想当然地用接口或者抽象class来假设的,但是你只要通知Linq to SQL,它就能解析并执行相应的功能。
写出增加、删除的demo:using(var dbt=new DataContext(this.connectionString)) { var u=new User{LogName="张三",Email="张三@1234.com"}; var u=dbt.GetTable<User>().InsertOnSubmit(u); dbt.SubmitChanges(); }using(var dbt=new DataContext(this.connectionString)) { var table=dbt.GetTable<User>(); var u=table.Where(u=>u.LogName=="1234").First(); //删除1234这个用户 table.DeleteOnSubmit(u); dbt.SubmitChanges(); }
var u=dbt.GetTable<User>().InsertOnSubmit(u);应该写为dbt.GetTable<User>().InsertOnSubmit(u); 我们看到还有很多人(大多数csdn上的人)在使用 “new SqlConnection”、“cmd.Execute.....”之类的代码,一些喜欢抽象、通用化的人使用DBConnection、DBCommand或者是IDbConnection、IDbCommand之类接口。当切换数据库时其实SQL还是要逐一修改、调试。这些人的做法还没有进入Linq操作数据库的门槛,还停留在操作数据库的原始阶段。网上有个开源项目 DLinq,她可以使用Linq provider处理许多种数据库,所有数据库的Linq接口都是通用的 DbLinq.Data.Linq.DataContext 继承来的,所以所有这些数据库操作方法都有同样的抽象类型,切换不同数据库时你编写的代码几乎从不用改变,因此也就几乎从来不用调试就能保证质量。
1.使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。
2.使用 Module 了解如下的类似信息:包含模块的程序集以及模块中的类等。您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。
3.使用 ConstructorInfo 了解如下的类似信息:构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。
4.使用 Type 的 GetConstructors 或 GetConstructor 方法来调用特定的构造函数。
5.使用 MethodInfo 来了解如下的类似信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用 Type 的 GetMethods 或 GetMethod 方法来调用特定的方法。
6.使用 FieldInfo 来了解如下的类似信息:字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如 static)等;并获取或设置字段值。
7.使用 EventInfo 来了解如下的类似信息:事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等;并添加或移除事件处理程序。
8.使用 PropertyInfo 来了解如下的类似信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。
9.使用 ParameterInfo 来了解如下的类似信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。
{
var u=dbt.GetTable<User>().Where(u=>u.LogName=="1234").First();
u.Email="[email protected]";
dbt.SubmitChanges();
}这样,Linq to SQL可以处理任意自定义类型。我只需要手写这个User类型上的Attribute声明: [Table]
public class User
{
private static Random Rnd = new Random(); private long _ID = long.MinValue; [Column(IsPrimaryKey=true)]
public long ID
{
get
{
if (_ID == long.MinValue)
_ID = (long)Rnd.Next() + DateTime.Now.Ticks;
return _ID;
}
set { _ID = value; }
} private string _LogName; [Column(DbType="nvarchar(40) NOT NULL")]
public string LogName
{
get { return _LogName; }
set { _LogName = value; }
} [Column(DbType = "varbinary(32) NULL")]
private byte[] PasswordMD5 { set; get; } private string _EMail; [Column(DbType = "nvarchar(100) NOT NULL")]
public string EMail
{
get { return _EMail; }
set { _EMail = value; }
} [Column(DbType = "bit NOT NULL")]
public bool DenyLogin { get; set; }
尽管大多数Linq to SQL的网上教程都教你在vs环境帮助下自动产生 .dbml 文件并自动产生相应的从 DataContext继承的数据源对象的方法,其实根本不需要,像这样仅仅在自定义的实体对象上定义相应的Attribute就可以使用Linq to SQL直接访问数据库了。Linq to SQL框架设计开发在先,然后你才使用它来编写你的数据库应用程序。这就是最关键的需求——对象的类型、属性等等都是在开发框架时预先不知道、无法想当然地用接口或者抽象class来假设的,但是你只要通知Linq to SQL,它就能解析并执行相应的功能。
{
var u=new User{LogName="张三",Email="张三@1234.com"};
var u=dbt.GetTable<User>().InsertOnSubmit(u);
dbt.SubmitChanges();
}using(var dbt=new DataContext(this.connectionString))
{
var table=dbt.GetTable<User>();
var u=table.Where(u=>u.LogName=="1234").First(); //删除1234这个用户
table.DeleteOnSubmit(u);
dbt.SubmitChanges();
}
我们看到还有很多人(大多数csdn上的人)在使用 “new SqlConnection”、“cmd.Execute.....”之类的代码,一些喜欢抽象、通用化的人使用DBConnection、DBCommand或者是IDbConnection、IDbCommand之类接口。当切换数据库时其实SQL还是要逐一修改、调试。这些人的做法还没有进入Linq操作数据库的门槛,还停留在操作数据库的原始阶段。网上有个开源项目 DLinq,她可以使用Linq provider处理许多种数据库,所有数据库的Linq接口都是通用的 DbLinq.Data.Linq.DataContext 继承来的,所以所有这些数据库操作方法都有同样的抽象类型,切换不同数据库时你编写的代码几乎从不用改变,因此也就几乎从来不用调试就能保证质量。
using System.Linq;namespace WuweiCommon
{
public interface IDomain : IDisposable
{
IQueryable<T> Cast<T>() where T : class;
void Insert<T>(T obj) where T : class;
void Update<T>(T obj) where T : class;
void Delete<T>(T obj) where T : class;
void Commit();
}
}
例如写: using (var dt = WuweiCommon.Extensions.GetDALInstance ())
{
var tm = dt.Cast<Team>().First(t => t.Name == TeamName);
tm.Name = Team.Name;
dt.Insert(tm);
dt.Commit();
}
当Commit()没有执行(例如抛出异常时),IDisposable.Dispose方法的实现会回滚数据库事务。而WuweiCommon.Extensions.GetDALInstance方法则是从应用程序的配置文件(app.config或者web.config文件等)来反射获取IDomain的具体实现类型(和对象)。我实现了超过7、8种IDomain作为产品的基础(临时实现的不算),从面向.net内存集合变量,到4种关系数据库、1种面向对象数据库、xml文件、以及一个大厂家提供的相当变态的远程访问api,都集成在同一个接口之下。
然后学orm框架