......!
一定要继续阅读。但我可以在这里告诉您,问题与DataContext无关,而与依赖注入有关。我将这个问题搁置一旁,因为它记录了一个可能的问题,即“未找到或更改的行”与现实中的并发冲突无关。
看来问题是由不正确的依赖项注入引起的。更确切地说,我开始相信,默认情况下,我使用的DI容器进行生命周期管理。
问题是我使用了DataContext作为Ninject提供的构造函数参数。似乎默认行为是缓存此DataContext,从而导致各种意外行为。我将对此提出另一个问题。
无论如何,接下来是我的原始问题,正如您将看到的那样,它远远没有真正地引起该问题的原因。
问题
我收到许多错误,这些错误暗示着DataContext,或更确切地说,我使用DataContext的方式已失去同步。
错误发生在db.SubmitChanges()上,其中db是我的DataContext实例。错误是:
找不到或更改行。
该问题只是间歇性地发生,例如,添加一行然后将其删除。如果我停止开发服务器并重新启动,则添加的行已存在,我可以删除它没有问题。
即,似乎该问题与DataContext丢失对已添加的行的跟踪有关。
重要:
在有人投票关闭该线程之前,基于它的重复,我已经检查了SQL Server Profiler,并且SQL中没有“ Where 0 = 1”。
我还重新创建了dbml文件,因此对数据库模式与dbml文件表示的模式同步感到满意。
即,不存在可匹配的可空/不可空列不匹配的情况,等等。
我的诊断(价值):
这个问题(对我而言)似乎与我如何使用DataContext有关。我是MVC,存储库和服务模式的新手,所以怀疑我把事情弄错了。
设置
处于早期阶段的简单电子学习应用程序。学生需要能够向其UserCourses添加和删除课程(Courses表)。
为此,我有一个将特定DataContext实例依赖项注入其构造函数的服务。
服务类构造函数:
public class SqlPupilBlockService : IPupilBlockService
{
DataContext db;
public SqlPupilBlockService(DataContext db)
{
this.db = db;
CoursesRepository = new SqlRepository<Course>(db);
UserCoursesRepository = new SqlRepository<UserCourse>(db);
}
// Etc, etc
}
CoursesRepository和UserCoursesRepository都是IRepository类型的服务类的私有属性(只是一个简单的通用存储库接口)。
SqlRepository代码:
public class SqlRepository<T> : IRepository<T> where T : class
{
DataContext db;
public SqlRepository(DataContext db)
{
this.db = db;
}
#region IRepository<T> Members
public IQueryable<T> Query
{
get { return db.GetTable<T>(); }
}
public List<T> FetchAll()
{
return Query.ToList();
}
public void Add(T entity)
{
db.GetTable<T>().InsertOnSubmit(entity);
}
public void Delete(T entity)
{
db.GetTable<T>().DeleteOnSubmit(entity);
}
public void Save()
{
db.SubmitChanges();
}
#endregion
}
添加和删除UserCourses的两种方法是:
添加和删除用户课程的服务方法:
public void AddUserCourse(int courseId)
{
UserCourse uc = new UserCourse();
uc.IdCourse = courseId;
uc.IdUser = UserId;
uc.DateCreated = DateTime.Now;
uc.DateAmended = DateTime.Now;
uc.Role = "Pupil";
uc.CourseNotes = string.Empty;
uc.ActiveStepIndex = 0;
UserCoursesRepository.Add(uc);
UserCoursesRepository.Save();
}
public void DeleteUserCourse(int courseId)
{
var uc = (UserCoursesRepository.Query.Where(x => x.IdUser == UserId && x.IdCourse == courseId)).Single();
UserCoursesRepository.Delete(uc);
UserCoursesRepository.Save();
}
阿贾克斯
我正在通过Ajax.BeginForm使用Ajax
我认为这无关紧要。
ASP.NET MVC 3
我正在使用mvc3,但不认为这是相关的:错误与模型代码有关。
最佳答案
该问题只是间歇性地发生,
例如,然后添加一行
删除它。如果我停止开发服务器
然后重新启动,添加的行就在那里
我可以删除它没有问题。
您的代码没有显示“添加的行”和“删除/更新”之间的链接是什么。您的Add()不返回对象引用。
我以为您缺少刷新(即在插入后重新加载对象)。您的IdCourse也是表中的PK吗?
关于asp.net-mvc - L2S DataContext不同步:找不到或更改行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4508402/