具有ObservableCollection(实体框架)的数据网格中的主键值

时间:2018-08-07 08:12:44

标签: c# sql wpf entity-framework

别对我投掷石头-我在编程方面是个新手,尤其是在Entity Framework中。

我创建了一个小程序,该程序将一些变量记录到SQL表中。为了用记录变量表示表,我使用了与ObservableCollection绑定的datagrid。 Datagrid看起来像这样:

recorded variable

Id 是带有种子1的主键。问题是如何在不查询SQL表的情况下显示实际的ID号?

我尝试过:

VariableRecordOCtoShow.Add(new VariableRecord() //VariableRecord is class from entity model
            {
                Value = newVariableRecord.Value,
                Time = newVariableRecord.Time,
                IdVariableAssignment = newVariableRecord.IdVariableAssignment,
                IdUser = newVariableRecord.IdUser
            });

但是在datagrid的Id列中只有零。

我尝试过:首先创建一个数据库,什么是las ID号

public int getIdValue()
{
    var query = (from p in context.VariableRecords  
                 orderby p.Id descending           
                 select p).Take(1).Single();       
    return query.Id; 
}

第二次将其写入do变量:

idVariable = getIdValue();

然后将其写入ObservableCollection的ID(不是实体模型的类)中,并在每条记录后将此变量加1(以下是写入方法的一部分):

VariableRecordOCtoShow.Add(new VariableRecord() // v tomto velkem radku jenom zapisuju do Observable Collection hodnoty ze vstupu + Id
            {
                Id = idVariable, //fake Id (calculated from query)
                Value = newVariableRecord.Value,
                Time = newVariableRecord.Time,
                IdVariableAssignment = newVariableRecord.IdVariableAssignment,
                IdUser = newVariableRecord.IdUser
            });

            idVariable++;

它有效,但仅在开始时-当我过夜测试程序时,性能出现了一些错误(某些变量未及时写入),并且最终OC的ID和SQL的ID不匹配。

你能帮我吗?如何在记录运行时不查询而在datagrid中显示 real 主键值?

谢谢。

1 个答案:

答案 0 :(得分:0)

  

问题在于如何在不查询SQL表的情况下显示实际的ID号?

我不确定你的问题

首先,为什么不查询SQL表?

其次,我们通常不在视图中显示ID字段(Identity字段)。这不是一个好习惯。

仍然要显示,则始终可以在EF中查询:

ObservableCollection<VariableRecords> v = 
      new  ObservableCollection<VariableRecords>(from p in context.VariableRecords
                                                 select c)

此外,您的第二种方法将来可能会出现问题,因为标识字段ID并不总是Max(ID)+1。 See this

  

值的重用–对于具有特定种子/增量的给定标识属性,标识值不会被引擎重用。如果特定的插入语句失败或插入语句回滚,则使用的标识值将丢失并且不会再次生成。生成后续标识值时,这可能会导致出现空白。