Linq简单查询返回意外结果

时间:2018-06-07 08:11:12

标签: c# .net sql-server linq asp.net-mvc-4

我按如下方式配置了与DB的连接:

的Web.config

<add name="MyContext" providerName="System.Data.SqlClient" connectionString="Data Source=MyServer;Initial Catalog=MyDB;User id=MyId;Password=MyPassword; MultipleActiveResultSets=true" />

然后我让我的班级创建上下文以访问数据库

    public class MyContext: DbContext
    {
        public MyContext() : base("MyContext")
        {
            Database.SetInitializer<Models.MyContext>(null);
        }

        public DbSet<MyModel> MyTable { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
}

然后我的数据库有'MyTable'表,这是一个历史表,所以每天6点我都会从另一个表中插入数据,最后我会得到这样的结果

Id | Date
-----------------------------
 1 | 2018-05-30 16:01:00.332
 1 | 2018-05-31 14:21:03.456
 1 | 2018-06-01 11:45:01.316
 2 | 2018-05-30 21:44:00.544
 2 | 2018-05-31 22:45:00.987
 2 | 2018-06-01 23:46:00.769

现在在MyController.cs

    public IQueryable<MyModel> GetData(string Id)
    {
        var result = MyContext.MyTable.AsQueryable();

        return result.Where(w => w.Id == Id).toList();
    }

我正在尝试返回Id = 1的所有行,在调试时我在return语句中设置断点,它为每条记录返回相同的行。

    Id | Date
    -----------------------------
     1 | 2018-05-30 16:01:00.332
     1 | 2018-05-30 16:01:00.332
     1 | 2018-05-30 16:01:00.332

编辑:我按照您的要求添加了MyModel类

 public class MyModel
    {
        [Index(IsUnique = false)]
        public int Id { get; set; }
        public DateTime Date{ get; set; }

        public string Field1 { get; set; }
        public string Field2 { get; set; }
        public string Field3 { get; set; }
        public string Field4 { get; set; }
        public string Field5 { get; set; }
        public string Field6 { get; set; }
        public string Field7 { get; set; }
        public DateTime? Field8 { get; set; }
        public string Field9 { get; set; }
        public string Field10 { get; set; }
        public string Field11 { get; set; }
        public string Field12 { get; set; }
        public string Field13 { get; set; }
        public string Field14 { get; set; }
        public string Field15 { get; set; }
        public string Field16 { get; set; }
        public string Field17 { get; set; }
        public string Field18 { get; set; }
        public string Field19 { get; set; }
        public int? Field20 { get; set; }
        public string Field21 { get; set; }
        public int? Field22  { get; set; }
        public int? Field23 { get; set; }
        public int? Field24  { get; set; }
        public string Field25 { get; set; }
        public string Field26 { get; set; }
        public string Field27 { get; set; }
        public int Field28 { get; set; }
        public string Field29 { get; set; }
        public string Field30 { get; set; }
        public string Field31 { get; set; }
        public string Field32 { get; set; }
        public string Field33 { get; set; }
        public DateTime? Field34 { get; set; }

    }

你能帮我弄清楚发生了什么吗?

感谢。

1 个答案:

答案 0 :(得分:1)

[Index(IsUnique = false)]
public int Id { get; set; }

这不会阻止Id成为主键。如果它确实你会看到另一个错误,EF要求你的课程PK。

您只在Id列上添加了额外的索引。没有删除PK约束。

所以我们的第一个怀疑似乎是正确的,你在内存中加载了一堆具有重复PK值的记录。当您尝试SaveChanges()时,您将收到错误或丢失数据。

简单修复看起来像

public class MyModel
{
    [Key]
    public int ModelId { get; set; }  // auto filled, ignore where you don't need it

    //[Index(IsUnique = false)] -- not needed
    public int Id { get; set; }       
    public DateTime Date{ get; set; }
    ...