Linq to sql Linq到Sql更新未持久化到数据库
我有一个通过linq到sql的标准更新,但是数据不会持久保存到数据库中 我通过.dbml文件设计器使用自动生成的类 更新声明如下:Linq to sql Linq到Sql更新未持久化到数据库,linq-to-sql,Linq To Sql,我有一个通过linq到sql的标准更新,但是数据不会持久保存到数据库中 我通过.dbml文件设计器使用自动生成的类 更新声明如下: public static void UpdateEmailsInWorkingTable(Guid emailGuid, string modifiedEmail) { using (EmailDBDataContext DBContext = new EmailDBDataContext()) { Emai
public static void UpdateEmailsInWorkingTable(Guid emailGuid, string modifiedEmail)
{
using (EmailDBDataContext DBContext = new EmailDBDataContext())
{
EmailAddress_Update EAUpdated = (from e in DBContext.EmailAddress_Updates
where e.EmailGuid == emailGuid
select e).SingleOrDefault();
EAUpdated.EmailAddress = modifiedEmail;
EAUpdated.IsValid = 'Y';
EAUpdated.UpdateFlag = true;
EAUpdated.LastChangedDtTm = DateTime.Now;
try
{
DBContext.SubmitChanges(ConflictMode.FailOnFirstConflict);
}
catch (ChangeConflictException ex)
{
// do stuff here
}
}
}
我查看了我的自动生成的DataContext类,唯一明显的区别是有问题的表EmailAddress_Update没有实现其他自动生成实体所实现的两个接口INotifyPropertyChanged和INotifyPropertyChanged
我假设这就是为什么更改没有被持久化的原因,不是吗
简单地说,对于这个类的任何部分,都不会生成任何可扩展性方法定义。如果这是我的问题的原因,那么数据库中的什么会导致此问题不能正确自动生成
谢谢~我也在MSDN上发布了这个问题:如果你想看到回复。但我找到了代码无法生成的部分原因 以下是我的MSDN回复中的一部分: 我创建了一个没有主键的小测试表,并将其添加到设计器中,果然没有为该实例生成任何可扩展性方法 因此,我随后向同一个表中添加了一个主键,并将其重新添加到设计器中,确保生成了所有扩展性方法和更改跟踪事件
我现在的问题是,为什么必须有一个主键才能自动生成这些东西?好吧,那么来回答我自己的问题“我现在的问题是,为什么必须有一个主键才能自动生成这些东西?”我在Joe Joseph C.Rattz,Jr.写的Pro LINQ一书中找到了它 我在读如何处理视图和表,他说: 因为视图生成的实体类不包含映射为主键的实体类属性,所以它们是只读的。如果您认为没有主键,DATACONTROX就没有有效的方法来提供身份跟踪,这是有意义的。
谜团和问题已解决。在您的try-catch块中,EmailDBContext是否假定为DBContext?是的,很抱歉我修改了它,并忘了在那里更改它-这不会影响原始问题,只是我的输入错误。如果调用
SingleOrDefault
您最好处理EAUpdated
可能是空指针的事实。如果您不想处理空的情况,那么您应该只调用Single
。