清洁/脏合并集合

时间:2013-11-13 14:37:16

标签: visual-studio-lightswitch

我有一个实体,我们称之为瓶子。此实体包含名为Default的布尔属性。

我有一个带有DataGrid的屏幕,我可以在其中添加编辑和删除瓶子。验证的要求是只能有一个“默认”瓶子。换句话说,只有一个Bottle可以将其Default属性(datagrid中的复选框)设置为true。我已经处理过屏幕验证,但是我仍然需要为多用户场景处理DataServiceValidation。

如何获得清洁/脏实体的合并集合?请注意这是一个Visual Studio LightSwitch问题。

2 个答案:

答案 0 :(得分:1)

要记住以下

之类的查询

this.Bottles.Where(b => b.Default).Any())

将针对数据存储执行。它不会反映可能已在本地修改但尚未保存的任何实体的状态。一旦调用execute方法并将where运算符应用于结果

this.HourTypes.Where(h => h.DefaultType).Execute()。Where(h => h.DefaultType).Any()

第二个将针对我们从数据存储返回的实体的本地版本执行的位置。

为了解决您的问题,我认为您需要针对当前更改以及数据存储查询执行本地查询。我已经在下面包含了一些验证逻辑,我认为它将解决您的问题。

partial void Bottles_Validate(Bottle entity, EntitySetValidationResultsBuilder results)
{
    // Only run the Default Bottle validation logic for Bottles that will be Default Bottle.
    if ((entity.Details.EntityState == EntityState.Added 
            || entity.Details.EntityState == EntityState.Modified) 
        && entity.Details.Properties.IsDefault.IsChanged 
        && entity.IsDefault)
    {
        // Query the current set of changes to ensure there are not multiple Default bottles in it.
        bool hasMultipleNewOrModifiedDefaultBottles = this.Details.GetChanges()
            .OfType<Bottle>()
            .Any(e => (e.Details.EntityState == EntityState.Added 
                    || e.Details.EntityState == EntityState.Modified)
                && e.IsDefault
                && e != entity);
        if (hasMultipleNewOrModifiedDefaultBottles)
        {
            results.AddEntityError("Only 1 default bottle can exist.");
        }
        else
        {
            // Grab the current Default Bottle from the data store if one exists and ensure it 
            // is still marked as the default. This needs to account for the scenarios in which
            // the Bottle has been changed to no longer be marked as the Default
            // and the scenario in which the Bottle is being deleted.
            Bottle defaultPersistedBottle = this.Bottles.Where(b => b.IsDefault)
                .SingleOrDefault();
            if (defaultPersistedBottle != null
                && defaultPersistedBottle.IsDefault
                && defaultPersistedBottle.Details.EntityState != EntityState.Deleted)
            {
                results.AddEntityError("Only 1 default bottle can exist.");
            }
        }
    }

}

答案 1 :(得分:0)

您需要Bottles_Validate方法。示例(未测试):

partial void ApplicationUsers_Validate(ApplicationUser entity, EntitySetValidationResultsBuilder results)
{
    if(entity.Details.EntityState != EntityState.Unchanged && entity.Details.Properties.Default.IsChanged && entity.Details.Properties.Default.Value)
    {
        //changed/created a default bottle
        if(this.Bottles.Where(b => b.Default).Any())
        {
            results.AddEntityError("Only 1 default bottle can exist.");
        }
    }