使用 LINQ to SQL 类所需的帮助
Posted
技术标签:
【中文标题】使用 LINQ to SQL 类所需的帮助【英文标题】:Help needed on using LINQ to SQL classes 【发布时间】:2011-01-05 14:53:17 【问题描述】:已经生成了默认类。有2个:1.DataContext 2.表对象类
现在: 1.如何向数据类添加功能(扩展)。我创建了单独的部分类。
我需要对数据上下文进行任何扩展吗?
我需要在我自己的自定义构造函数中调用生成类构造函数吗?
如何创建数据类的新实例?
一个问题是 DB 名称 (Databahn) 和 (我不知道还有什么) 与 dbml 紧密相连。如果我将来更改我的数据库名称等,这会如何?
我可以更改类名吗?不希望它们与数据库表名相同?
[global::System.Data.Linq.Mapping.DatabaseAttribute(Name="Databahn")]
public partial class AgentsDataContext : System.Data.Linq.DataContext
【问题讨论】:
“向数据类添加功能(扩展)”是什么意思。您在考虑什么功能? 我的意思是对象类的业务逻辑(从表中生成)。 另外 - 如果使用 VS2008SP1,请注意“当我添加 MyDataContext.cs 时我生成的代码消失了”错误(在 VS2010 中修复)。如果您遇到这种情况,有一个解决方法。 【参考方案1】:我通常会为 Linq to Sql 手动滚动我自己的数据上下文和数据对象。我将创建一个示例数据上下文、表对象和检索器方法,以在这里展示我的小自制策略。我们会说我的数据库名称是“Main”,我的表对象将是 sql 中的“dbo.Person”。
这里是:
代表我的数据库的DataContext:
internal class MainDataContext : System.Data.Linq.DataContext
private static MappingSource _mappingSource = new AttributeMappingSource();
internal MainDataContext(string connectionString)
: base(connectionString, _mappingSource)
internal Table<PersonDto> PersonDtos get return GetTable<PersonDto>();
Dto 代表我的表:
[Table(Name = "dbo.Person")]
internal class PersonDto
private Guid _id;
[Column(Storage = "_id", IsPrimaryKey = true)]
public Guid Id
get return _id;
set _id = value;
private string _name;
[Column(Storage = "_name")]
public string Name
get return _name;
set _name = value;
private DateTime _dateCreated;
[Column(Storage = "_dateCreated")]
public DateTime DateCreated
get return _dateCreated;
set _dateCreated = value;
现在终于 PersonRetriever 类:
public class PersonRepository
private string _connectionString;
public PersonRepository(string connectionString)
_connectionString = connectionString;
string GetPersonName(Guid personId)
using (var db = new MainDataContext(_connectionString))
string personName = string.Empty;
PersonDto person = db.PersonDtos.FirstOrDefault(c => c.Id == personId);
if (person != null)
personName = person.Name;
return personName;
需要注意的几点:我在数据上下文中声明了一个静态映射源以传递给基本数据上下文,仅用于在执行预编译的 linq 查询时保持状态。没必要,有一个只接受连接字符串的基本构造函数。
此外,请确保在声明 Dto 时,公共属性名称与数据库中的表完全匹配。您的私人成员可以随意命名。
希望这会有所帮助!
【讨论】:
你也可以在你的 Dto 对象上显式地实现一个接口。 (PersonDto:IPerson)。这样,当您从数据库中检索时,您可以只返回接口,而不必进行映射。这将有助于分层。【参考方案2】:您可以在 dbml/designer 中更改类型名称。它不必与表名完全匹配。
重新构造函数;要链接到另一个现有构造函数,您可以在构造函数声明之后使用 :this(...)
语法(在正文之前)。
不:如果您只是添加部分类片段,则不需要修改数据上下文。
你创建一个新实例只需使用new
- 它与以前的类型相同(部分类只是将一个类型拆分为编译器必须合并的几个物理文件)。
Re 是数据上下文中的数据库名称;在运行时从配置中获取连接详细信息是很常见的,在这种情况下会被忽略。
【讨论】:
我想我没有把我的问题说清楚:)。我只是在看到一个简单表格的大量自动生成代码时不知所措。现在我需要访问类、制作对象、保存到数据库并简单地查询数据库。为此,我想知道生成 linq 2 sql 后要遵循的一般模式。任何人如何与这些数据类交互。一些例子会很有帮助。 @Munish - 在一篇短文中很难完整地做到这一点;你读过 MSDN 的资料吗?或者也许是“LINQ in Action”? 我猜是的。很难把它全部放在这里:) 所以似乎需要通读所有细节。无论如何我没有太多的表(abt 10),我只是想利用现有的工具来节省生成类和 DAL 的劳动力。考虑到学习曲线和不熟悉,可能不会有利于投资回报率。我认为这些 ORM 工具主要用于大型数据库,无法自行管理/ @Munish - 对于某些 ORM 可能是这样,但 L2S 足够简单,即使对于单个表也能提供巨大的价值。以上是关于使用 LINQ to SQL 类所需的帮助的主要内容,如果未能解决你的问题,请参考以下文章