如何让 Linq2Sql 与我的模型一起工作
How to make Linq2Sql work with my models
我在一个项目上工作,我们使用 SqlConnection
、SqlCommand
和普通 SQL 来访问存储库。现在,我正在尝试迁移到 Linq2Sql,并且我想使用相同的模型。我怎样才能做到这一点?
我会将项目结构简化为最小的有意义的示例。
假设我有以下 classes:
namespace Model
{
public class User
{
public int Id { get; set; }
}
}
Model
命名空间中的所有模型都是数据库实体的一对一副本。
namespace Repository
{
public class UserRepository
{
private _sqlConnectionHelper = new SqlConnectionHelper();
public User GetUser()
{
var reader = _sqlConnectionHelper
.ExecuteAndReturnReader("SELECT * FROM [dbo].[Users]");
while (reader.Read())
{
return new User
{
Id = (int)reader["Id"]
};
}
return null;
}
}
}
现在我正在尝试迁移到 Linq2Sql。我在 Repository
项目中用 User
table 创建了一个 MyContext.dmbl
文件。它生成了以下 class:
namespace Repository
{
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Users")]
[global::System.Runtime.Serialization.DataContractAttribute()]
public partial class User: INotifyPropertyChanging, INotifyPropertyChanged
{
private int _ID;
public int ID
{
get
{
return this._ID;
}
set
{
if ((this._ID != value))
{
this.OnIDChanging(value);
this.SendPropertyChanging();
this._ID = value;
this.SendPropertyChanged("ID");
this.OnIDChanged();
}
}
}
// Some other methods
}
}
现在,问题是我有很多实体、存储库、模型等。我不想更改整个项目以使用新生成的模型,而不是来自 Model
命名空间的模型。我怎样才能让 Linq2Sql
与我的模型一起工作?
它也会影响我的架构,因为在这些模型的情况下,实体和存储库是同一个对象。我不需要我的实体是 CRUD 对象。我只想对项目进行最少的更改,并且只使用方便的 LINQ 请求而不是像这样的普通 SQL:
namespace Repository
{
public class UserRepository
{
private MyContextDataContext _myContext = new MyContextDataContext();
public User GetUser()
{
return _myContext.Users.FirstOrDefault();
}
}
}
或者我只是不了解 Linq2Sql
的目的和逻辑,它是如何工作的?
当然,我可以编写转换器或使用反射并复制对象 属性-by-属性,但这听起来不是一个好的解决方案。
好的。最后,我找到了一个非常简单的答案——Linq2Sql
不是我要找的库。
对象关系映射有不同的方法:code-first、database-first、model-首先.
这里是 good Whosebug article about their differences.
现在,当我了解到它时,我在问题中描述的内容可以很容易地改写为 "how can I make Linq2Sql be code-first"。答案很简单——我做不到。
经过一些调查,我了解到我正在寻找 Entity Framework,它非常适合我的项目。
现在,我的存储库如下所示:
namespace Repository
{
public MyContextDataContext : DbContext
{
public DbSet<User> Users { get; set; }
}
public class UserRepository
{
private MyContextDataContext _myContext = new MyContextDataContext();
public User GetUser()
{
return _myContext.Users.FirstOrDefault();
}
}
}
我在一个项目上工作,我们使用 SqlConnection
、SqlCommand
和普通 SQL 来访问存储库。现在,我正在尝试迁移到 Linq2Sql,并且我想使用相同的模型。我怎样才能做到这一点?
我会将项目结构简化为最小的有意义的示例。
假设我有以下 classes:
namespace Model
{
public class User
{
public int Id { get; set; }
}
}
Model
命名空间中的所有模型都是数据库实体的一对一副本。
namespace Repository
{
public class UserRepository
{
private _sqlConnectionHelper = new SqlConnectionHelper();
public User GetUser()
{
var reader = _sqlConnectionHelper
.ExecuteAndReturnReader("SELECT * FROM [dbo].[Users]");
while (reader.Read())
{
return new User
{
Id = (int)reader["Id"]
};
}
return null;
}
}
}
现在我正在尝试迁移到 Linq2Sql。我在 Repository
项目中用 User
table 创建了一个 MyContext.dmbl
文件。它生成了以下 class:
namespace Repository
{
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Users")]
[global::System.Runtime.Serialization.DataContractAttribute()]
public partial class User: INotifyPropertyChanging, INotifyPropertyChanged
{
private int _ID;
public int ID
{
get
{
return this._ID;
}
set
{
if ((this._ID != value))
{
this.OnIDChanging(value);
this.SendPropertyChanging();
this._ID = value;
this.SendPropertyChanged("ID");
this.OnIDChanged();
}
}
}
// Some other methods
}
}
现在,问题是我有很多实体、存储库、模型等。我不想更改整个项目以使用新生成的模型,而不是来自 Model
命名空间的模型。我怎样才能让 Linq2Sql
与我的模型一起工作?
它也会影响我的架构,因为在这些模型的情况下,实体和存储库是同一个对象。我不需要我的实体是 CRUD 对象。我只想对项目进行最少的更改,并且只使用方便的 LINQ 请求而不是像这样的普通 SQL:
namespace Repository
{
public class UserRepository
{
private MyContextDataContext _myContext = new MyContextDataContext();
public User GetUser()
{
return _myContext.Users.FirstOrDefault();
}
}
}
或者我只是不了解 Linq2Sql
的目的和逻辑,它是如何工作的?
当然,我可以编写转换器或使用反射并复制对象 属性-by-属性,但这听起来不是一个好的解决方案。
好的。最后,我找到了一个非常简单的答案——Linq2Sql
不是我要找的库。
对象关系映射有不同的方法:code-first、database-first、model-首先.
这里是 good Whosebug article about their differences.
现在,当我了解到它时,我在问题中描述的内容可以很容易地改写为 "how can I make Linq2Sql be code-first"。答案很简单——我做不到。
经过一些调查,我了解到我正在寻找 Entity Framework,它非常适合我的项目。
现在,我的存储库如下所示:
namespace Repository
{
public MyContextDataContext : DbContext
{
public DbSet<User> Users { get; set; }
}
public class UserRepository
{
private MyContextDataContext _myContext = new MyContextDataContext();
public User GetUser()
{
return _myContext.Users.FirstOrDefault();
}
}
}