......!

一定要继续阅读。但我可以在这里告诉您,问题与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/

10-16 03:59