使用 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 类所需的帮助的主要内容,如果未能解决你的问题,请参考以下文章

仅加载给定类所需的模块

SQL 帮助,获取所需的输出

如何改进 Linq-To-Sql 代码

Linq to Sql vs Nhibernate vs SubSonic vs 存储过程(帮助)

扩展类所需的不一致?

如何导入BASE64Encoder类所需的包