Linq到Sql更新不会持久到数据库
问题描述:
我有一个标准的更新通过linq到sql发生,但数据不会持久到数据库。Linq到Sql更新不会持久到数据库
我通过.dbml文件设计师使用自动生成的类。
UPDATE语句如下:
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没有实现这两个接口INotifyPropertyChanging和INotifyPropertyChanged的,其他自动生成的实体。
我假设,这是为什么所做的更改不会被持久化的原因是它不???
简单地说没有扩展方法的定义为这一类的任何部分获取生成。如果这是我的问题的原因,数据库中的什么会导致这不会自动生成正确?
谢谢〜
答
我张贴了这个问题,在MSDN上以及在这里:MSDN Linq to Sql如果你想看到的答复。但是我发现代码不能生成的部分原因。
这里是我的MSDN响应一块:
我创建了一个小的测试表没有主密钥,并将其添加到设计果然它没有产生任何的扩展方法该实例。
所以我加入到同一个表格和主键它重新添加到设计果然所有的扩展方法,并更改生成跟踪事件。现在
我的问题是,为什么一定要有这个东西自动生成主键?
答
好了,所以回答我的问题:“我现在的问题是,为什么必须要有这个东西自动生成主键?”我发现它在乔·约瑟夫·Rattz写的书临LINQ,小
我阅读如何处理的意见与表和他这样说:
“因为对视图生成的实体类不包含映射为主键的实体类属性,它们是只读的。如果您认为没有主键,则DataContext没有提供身份跟踪的有效方法,这是有道理的。“
神秘和问题解决。
在你的try catch块中是EmailDBContext假设是DBContext? – 2010-01-08 00:51:13
对不起,我修改了它,并忘记在那里修改它 - 这不影响原始问题,只是我的一个错字。 – 2010-01-08 16:20:12
如果你调用'SingleOrDefault',你最好处理'EAUpdated'可以是空指针的事实。如果你不想处理空情况,那么你应该调用'Single'。 – 2010-01-08 18:39:28