【问题标题】:Help needed on using LINQ to SQL classes使用 LINQ to SQL 类所需的帮助
【发布时间】:2011-01-05 14:53:17
【问题描述】:

已经生成了默认类。有2个:1.DataContext 2.表对象类

现在: 1.如何向数据类添加功能(扩展)。我创建了单独的部分类。

  1. 我需要对数据上下文进行任何扩展吗?

  2. 我需要在我自己的自定义构造函数中调用生成类构造函数吗?

  3. 如何创建数据类的新实例?

一个问题是 DB 名称 (Databahn) 和 (我不知道还有什么) 与 dbml 紧密相连。如果我将来更改我的数据库名称等,这会如何?

我可以更改类名吗?不希望它们与数据库表名相同?

[global::System.Data.Linq.Mapping.DatabaseAttribute(Name="Databahn")]
public partial class AgentsDataContext : System.Data.Linq.DataContext

【问题讨论】:

  • “向数据类添加功能(扩展)”是什么意思。您在考虑什么功能?
  • 我的意思是对象类的业务逻辑(从表中生成)。
  • 另外 - 如果使用 VS2008SP1,请注意“当我添加 MyDataContext.cs 时我生成的代码消失了”错误(在 VS2010 中修复)。如果您遇到这种情况,有一个解决方法。

标签: .net linq-to-sql orm


【解决方案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 足够简单,即使对于单个表也能提供巨大的价值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
相关资源
最近更新 更多