DLinq 仅支持SQL SERVER ,不支持Mysql/Oracle
最近使用了visual studio 2008,感觉了一下Dlinq的强大,但是发现Dlinq仅仅能在Sql Server下使用,无法使用其他数据库。如果你在项目中试图拖拽一个非 Sql Server的数据库表到设计窗口上,会报一个不支持类型的错误,即使是 Access也不支持,更不要提MySql了。
我还发现,自动产生的实体类代码的 System.Data.Linq.DataContext 提供了一些构造函数,
其中有一个传入 System.Data.IDbConnection 类型的构造函数。那是不是意味着只要我的实体类已经存在了,在进行连接数据库时只要传入一个 System.Data.IDbConnection 类型的参数,就可以操作任意数据库了?答案是否定的。因为当你使用 SubmitChange()方法试图保存到数据库中时,如果传入的 System.Data.IDbConnection 对象不是一个 SqlConnection 的话不会成功。
我就很奇怪,既然 DLINQ 允许这个构造函数,为何还不行呢?如果不允许那就只允许 Sqlconnnection,为何要这样设计,我猜测是为了将来的扩展吧!虽然现在DLINQ支持的数据库还不多,但是我想微软会继续扩展的。多关注 ScottGu 的Blog吧。那到底后台代码是怎么回事呢?用 Reflector 查看 System.Data.linq.dll ,你会发现事实上 DLinq的SubmitChange()方法在使用一个 IProvider 的接口,而这个接口的代码如下:
我还发现,自动产生的实体类代码的 System.Data.Linq.DataContext 提供了一些构造函数,
public partial class BaseEntityDataContext : System.Data.Linq.DataContext
{
private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource();
(省略一些代码) public BaseEntityDataContext() :
base(global::IVTrade.Entity.BaseEntity.Properties.Settings.Default.IVTradeConnectionString, mappingSource)
{
OnCreated();
}
public BaseEntityDataContext(string connection) :
base(connection, mappingSource)
{
OnCreated();
}
public BaseEntityDataContext(System.Data.IDbConnection connection) :
base(connection, mappingSource)
{
OnCreated();
}
public BaseEntityDataContext(string connection, System.Data.Linq.Mapping.MappingSource mappingSource) :
base(connection, mappingSource)
{
OnCreated();
}
public BaseEntityDataContext(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) :
base(connection, mappingSource)
{
OnCreated();
}
{
private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource();
(省略一些代码) public BaseEntityDataContext() :
base(global::IVTrade.Entity.BaseEntity.Properties.Settings.Default.IVTradeConnectionString, mappingSource)
{
OnCreated();
}
public BaseEntityDataContext(string connection) :
base(connection, mappingSource)
{
OnCreated();
}
public BaseEntityDataContext(System.Data.IDbConnection connection) :
base(connection, mappingSource)
{
OnCreated();
}
public BaseEntityDataContext(string connection, System.Data.Linq.Mapping.MappingSource mappingSource) :
base(connection, mappingSource)
{
OnCreated();
}
public BaseEntityDataContext(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) :
base(connection, mappingSource)
{
OnCreated();
}
其中有一个传入 System.Data.IDbConnection 类型的构造函数。那是不是意味着只要我的实体类已经存在了,在进行连接数据库时只要传入一个 System.Data.IDbConnection 类型的参数,就可以操作任意数据库了?答案是否定的。因为当你使用 SubmitChange()方法试图保存到数据库中时,如果传入的 System.Data.IDbConnection 对象不是一个 SqlConnection 的话不会成功。
我就很奇怪,既然 DLINQ 允许这个构造函数,为何还不行呢?如果不允许那就只允许 Sqlconnnection,为何要这样设计,我猜测是为了将来的扩展吧!虽然现在DLINQ支持的数据库还不多,但是我想微软会继续扩展的。多关注 ScottGu 的Blog吧。那到底后台代码是怎么回事呢?用 Reflector 查看 System.Data.linq.dll ,你会发现事实上 DLinq的SubmitChange()方法在使用一个 IProvider 的接口,而这个接口的代码如下:
internal interface IProvider : IDisposable
{
// Methods
void ClearConnection();
ICompiledQuery Compile(Expression query);
void CreateDatabase();
bool DatabaseExists();
void DeleteDatabase();
IExecuteResult Execute(Expression query);
DbCommand GetCommand(Expression query);
string GetQueryText(Expression query);
void Initialize(IDataServices dataServices, object connection);
IMultipleResults Translate(DbDataReader reader);
IEnumerable Translate(Type elementType, DbDataReader reader);
// Properties
int CommandTimeout { get; set; }
DbConnection Connection { get; }
TextWriter Log { get; set; }
DbTransaction Transaction { get; set; }
}
看见了吧,是 internal 的,如果不是,自己就可以在扩展了。期待微软将来支持其他的数据库,至少要支持Ado.net 中已经支持了的 Oracle 吧。
{
// Methods
void ClearConnection();
ICompiledQuery Compile(Expression query);
void CreateDatabase();
bool DatabaseExists();
void DeleteDatabase();
IExecuteResult Execute(Expression query);
DbCommand GetCommand(Expression query);
string GetQueryText(Expression query);
void Initialize(IDataServices dataServices, object connection);
IMultipleResults Translate(DbDataReader reader);
IEnumerable Translate(Type elementType, DbDataReader reader);
// Properties
int CommandTimeout { get; set; }
DbConnection Connection { get; }
TextWriter Log { get; set; }
DbTransaction Transaction { get; set; }
}