2010-07-14 48 views
4

我有一个简单的'TODO'列表的Silverlight 4应用程序。我遇到的问题是数据绑定挂钩了我的TODO对象上的关系,这会导致RIA数据上下文在我需要它之前将它添加到DataContext.TODOs列表中。 我想将对象视为新对象并分离,直到我明确准备将其添加到datacontext。如何在我准备好之前防止Silverlight RIA实体附加到datacontext


下面是它如何工作的: 我已经得到了其与Status(RIA服务实体关系)有关我TODO实体。

我创建了一个新的TODO()实体,它被传递给ChildWindow弹出窗口。请注意,我不会将这个新实体添加到我的datacontext中。

new CreateTODOPopup(new TODO()).Show(); 

在我ChildWindow数据形我有Status一个ComboBox这是数据绑定到DataContext.Statuses

的问题是,选择从下拉列表中选择Status的作用下,实体实际上关联到我的背景 - 结束了给它的EntityState.New的状态,实际上它添加到DataContext.TODOs colleciton。

这样会很好,除了它现在出现在主框架的主TODO列表中。我不想要这个,因为它还没有被ChildWindow提交。

我该如何解决这个问题?通过阻止实体被附加 - 或者以某种方式将它从任何控制中隐藏起来,直到它被添加为止。

回答

0

您是否尝试过在对象上使用Context.Detach,以便您明确指定它不应该在上下文中?然后,您可以在保存之前再次使用Context.Attach。

+1

我从来没有explititly附加它,它只是重视自己。我不知道什么时候我会分开它 – 2010-07-14 21:18:00

1

您应该能够通过使用分部类为TODO实体添加另一个“MyProject”属性来获得所需的行为。在你的弹出窗口中,你可以设置'MyProject'属性而不是'Project'属性。当你保存你的TODO时,你可以直接将'MyProject'的值应用到'Project'中。有点迂回,但它应该给你你想要的行为。

凯尔

+0

偷偷摸摸的+1。当然不是可扩展但有趣的想法 – 2010-07-14 20:53:11

+0

另一种方法可能是使用StatusId而不是Status来创建关联。我从两种方法中看到了不同的行为。 – 2010-07-19 19:55:50

1

我想一个方法是使用一个PagedCollectionView并筛选出“新”实体 - 但必须有明显的东西你错过了。

// data bind list to this ICollectionView 
    private PagedCollectionView _projects; 
    public PagedCollectionView Projects 
    { 
     get 
     { 
      if (_projects == null) 
      { 
       _projects = new PagedCollectionView(_todoDomainContext.TODOProjects) 
       { 
        Filter = i => { 

         DM.TODOProject proj = (DM.TODOProject)i; 

         // hide New entities 
         if (proj.EntityState == EntityState.New) 
         { 
          return false; 
         } 

         return true; 
        } 
       }; 
      } 
      return _projects; 
     } 
    } 
+2

oops。我写给第三个人......给我自己......: - / – 2010-07-18 03:52:17

1

重要:后3天,一个可怕的种族类型条件挣扎它竟然是直接相关的问题。基本上,结论是 - 如果您尝试创建实体并且不将它们添加到数据上下文中,那么不需要,前提是您不需要竞争条件和意外行为。我很确定这是一个RIA服务错误。

我在做什么:

  • 创建new TODO()并将它传递给我的看法
  • 允许RIA服务框架,以我TODO所有的外键的表相关联,如StatusAssignedTo
  • 在'保存'上将TODO()添加到列表中,如果它尚未出现在DataContext.TODOs实体集中。

什么框架做本身:

  • 当视图设置对象(通过comobox)的外键会自动添加TODODataContext.TODOS集合。这只是实体工作的方式。

为什么这是不好:

  • 当在我UI浏览一些可怕的竞争条件存在的。
  • 预先存在的行(即使在我的应用程序启动之前存在的那些行)被标记为New - 有时最多可以有20行,然后重新保存为新的重复行。

我如何固定它:

  • 始终创建实体立即添加到数据上下文的创建。

下面是关于创造马上加入实体的一些示例代码 - 无竞争状态:

for (int i = 0; i < 3; i++) 
{ 
    var entity = new DM.TODO(); 
    _todoDomainContext.TODOs.Add(entity); 

    entity.TODOStatu = pendingStatus; 
    entity.TODOProject = project; 
    entity.TODOCompany = company; 

    entity.CreateDt = DateTime.Now; 

    entity.Title = "generated todo " + DateTime.Now.ToString(); 
    entity.Details = "12345"; 
} 

此代码没有工作,并且将导致竞争 - 外键约束条件之后,将实体已经设置:

for (int i = 0; i < 3; i++) 
{ 
    var entity = new DM.TODO(); 

    entity.TODOStatu = pendingStatus; 
    entity.TODOProject = project; 
    entity.TODOCompany = company; 

    entity.CreateDt = DateTime.Now; 

    entity.Title = "generated todo " + DateTime.Now.ToString(); 
    entity.Details = "12345"; 

    _todoDomainContext.TODOs.Add(entity); 
} 
相关问题