已生成默认类。有2:1。DataContext 2.表对象类
现在: 1.如何向数据类添加功能(扩展)。我创建了单独的部分类。
我是否需要对数据上下文进行任何扩展?
我是否需要在自己的自定义构造函数中调用生成类构造函数?
如何创建数据类的新实例?
值得关注的是dbml严格附加了DB名称(Databahn)和(我不知道还有什么)。如果我将来更改我的数据库名称等,这是怎么回事?
我可以更改班级名称吗?不希望它们与DB表名相同吗?
[global::System.Data.Linq.Mapping.DatabaseAttribute(Name="Databahn")]
public partial class AgentsDataContext : System.Data.Linq.DataContext
答案 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中获取连接详细信息,在这种情况下会忽略它。