使用LINQ to SQL类需要帮助

时间:2011-01-05 14:53:18

标签: .net linq-to-sql orm

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

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

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

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

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

  4. 值得关注的是dbml严格附加了DB名称(Databahn)和(我不知道还有什么)。如果我将来更改我的数据库名称等,这是怎么回事?

    我可以更改班级名称吗?不希望它们与DB表名相同吗?

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

2 个答案:

答案 0 :(得分:3)

我通常手动将自己的datacontexts和数据对象用于Linq to Sql。我将创建一个示例datacontext,表对象和检索器方法,以显示我的小型自制策略。我们说我的数据库名称是“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>(); } }
}

代表我的桌子:

[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;
        }
    }
}

需要注意的一些事项:我在datacontext中声明一个静态映射源,以传递给基本数据上下文,仅用于在执行预编译的linq查询时保持状态。没有必要,只有一个基本构造函数可以接受连接字符串。

此外,请确保在声明您的Dtos时,公共属性名称与数据库中的表格完全匹配。您的私人会员可以随意命名。

希望这有帮助!

答案 1 :(得分:0)

您可以在dbml / designer中更改类型名称。它不必与表名完全匹配。

重构构造函数;要链接到另一个现有的构造函数,您可以在构造函数声明之后使用:this(...)语法(在正文之前使用)。

否:如果只是添加部分类片段,则无需修改数据上下文。

哟使用new创建一个新实例 - 它与之前的类型相同(部分类只是将一个类型拆分为编译器必须合并的几个物理文件)。

在数据上下文中重新创建数据库名称;通常在运行时从config中获取连接详细信息,在这种情况下会忽略它。