我目前正在更新使用数据表使用EF的旧winforms代码,这只是为了保持所有新编程和旧编程内联,但这并不重要。
我的问题如下: 我有一个表格需要2个表格(下面的例子 - 不是实际的表格)
Table A:
- Reference [key]
- Description
- Version
Table B:
- Table A Reference [key]
- Test Number [key]
- Description
我正在查询这些表:
public TableA GetTableA(string Reference)
{
TableA query;
using (DBContext db = new DBContext())
{
//Collect current result from db where Reference = TableA.Reference
query = (from a in db.TableA
where a.Reference == Reference
select a).SingleOrDefault();
}
return query;
}
然后对于另一个表,它只是一个列表而不是单个记录(所以只需用List和query.ToList等替换上面的值)。
然后,用户可以用一种形式在表格中添加/删除/更新数据,这很好,但是在保存回db时,由于不再跟踪模型,我遇到了问题此时我的DBContext所以我必须进行手动检查。
表A很简单,我只是从DB中拉出记录,其中Reference = myModel.Reference然后添加:
db.Entry(oldTableA).CurrentValues.SetValues(TableA);
但是对于表B,我必须手动检查
添加/删除的内容// Count values in current TableB model
int countTableB = tableB.Count();
List<TableB> deletedTableB = (from tb in db.TableB
where tb.Reference == Table.Reference
&& tb.TeNo > countTableB
select tb).ToList();
db.TableB.RemoveRange(deletedTableB);
foreach(var item in TableB)
{
TableB oldTableB = (from tb in db.TableB
where tb.Reference == item.Reference
&& tb.TeNo == item.TeNo
select tb).SingleOrDefault();
if(oldTableB != null)
{
db.Entry(oldTableB).CurrentValues.SetValues(item);
}
else
{
db.TableB.Add(item);
}
}
db.SaveChanges();
(注意:上面的内容也在原始查询的使用块中)
我想知道这是否完全错误,我只是了解实体应该如何使用的工具,以及是否有更好的方法来比较和更新所有记录。
我的另一个想法是,只是删除TableB中TableB.Reference = TableA.Reference的所有值,然后只是这样的AddRange:
List<TableB> deletedVals = (from tb in db.TableB
where tb.Reference == Table.Reference
select tb).ToList();
db.TableB.RemoveRange(deletedVals);
db.TableB.AddRange(TableB);
db.SaveChanges();
但总体上不确定这是否仍然在良好的实践/ 2的整体速度差异。
除此之外,他们还需要实施检查以查看是否有更改并提示用户更新(即MessageBox - 我们检测到某些内容已更改,您想要保存吗?)但是他们还是非常坚持只有在某些内容发生变化时才会弹出,所以如果RemoveRange / AddRange查询适用于第一个问题,我是否有办法为此做一些事情(如果我删除了,那么添加项目我认为它会总是假设有一个更改,所以我必须默认使用我刚刚检查的当前代码 - 除了没有SaveChanges和添加通过ChangeTracker运行。)
编辑:通过添加一个改变是否找到结果的布尔值来绕过顶部,但这似乎有点痛苦,而不是设置&#34;使用&#34;在控制器(或视图模型)中阻塞,并将数据库上下文传递到业务逻辑层,但是从我所读到的有点顽皮的地方来看,在这种情况下这仍然适用吗?