0

我有一个实体,我们称之为瓶子。该实体除其他外还有一个名为 Default 的布尔属性。

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

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

4

2 回答 2

1

要记住的一件事是查询如下

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

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

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

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

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

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.");
            }
        }
    }

}

于 2014-01-10T16:12:49.560 回答
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.");
        }
    }
于 2013-11-18T12:54:27.647 回答