实体框架最佳实践(winforms + EF 6.1)

时间:2017-04-27 03:30:40

标签: c# winforms entity-framework

我目前正在更新使用数据表使用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;在控制器(或视图模型)中阻塞,并将数据库上下文传递到业务逻辑层,但是从我所读到的有点顽皮的地方来看,在这种情况下这仍然适用吗?

0 个答案:

没有答案
相关问题