使用实体框架& Linq使用DomainCollectionView检索插入的ID

时间:2011-09-19 07:18:47

标签: c# silverlight entity-framework mvvm mvvm-light

我在Silverlight 4.0中使用Entity Framework。当用户在我的表单上输入关键字时,我会检查我的EntityList<Keyword>,看看关键字是否存在。如果没有,我将它添加到数据库&amp;刷新我的EntityList。我不确定我这样做的方式是否100%在最佳实践的轨道上。

由于Kyle McClellan,我正在使用MVVM-Friendly DomainDataSource,DataCollectionView。这是我在构造函数中加载关键字实体的代码(上面带有声明):

private readonly MI2DomainContext _context = new MI2DomainContext();
private readonly DomainCollectionView<Keyword> _keywordView;
private readonly DomainCollectionViewLoader<Keyword> _keywordLoader;
private readonly EntityList<Keyword> _keywordSource;
private int enteredKeywordID = 0;

public ProvisionDashboardViewModel()
{
    this._keywordSource = new EntityList<Keyword>(this._context.Keywords);
    this._keywordLoader = new DomainCollectionViewLoader<Keyword>(LoadKeywords, LoadKeywordsCompleted);
    this._keywordView = new DomainCollectionView<Keyword>(this._keywordLoader, this._keywordSource);
    this._keywordView.MoveToFirstPage();
}

用户输入关键字并单击“搜索”后,我使用命令调用包含此代码的方法,其中“searchText”包含要搜索的用户输入值。这将创建我的Keyword类的新实例,将其添加到我的上下文中,提交更改,包括完成后的回调函数:

enteredKeywordID = (int)(from d in this._keywordSource.Source where d.keyword.ToLower() == searchText.ToLower() select d.keywordID).FirstOrDefault();
if (0 == enteredKeywordID) {
    Keyword kw = new Keyword() { keyword = searchText };
    this._context.Keywords.Add(kw);
    this._context.SubmitChanges(KeywordsAddedCompleted, null);
}

回调函数遍历AddedEntities集合(1)并设置enteredKeywordID值。然后,它使用MVVM-light消息发送消息,以调用使用先前输入的关键字搜索的API。此API返回稍后保存到我的数据库的数据,需要在此处设置enteredKeywordID变量:

private void KeywordsAddedCompleted(SubmitOperation so)
{
    if (so.HasError)
    {
        so.MarkErrorAsHandled();
     }
     else
     {
         foreach (Keyword item in so.ChangeSet.AddedEntities) {
             enteredKeywordID = item.keywordID;
         }
        Messenger.Default.Send<string>(SearchText, "GenerateKeywords");     
     }
  }

有更好的方法吗?

0 个答案:

没有答案