Linq to sql Linq到Sql更新未持久化到数据库

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

我有一个通过linq到sql的标准更新,但是数据不会持久保存到数据库中

我通过.dbml文件设计器使用自动生成的类

更新声明如下:

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