我有一个实体,我们称之为瓶子。此实体包含名为Default的布尔属性。
我有一个带有DataGrid的屏幕,我可以在其中添加编辑和删除瓶子。验证的要求是只能有一个“默认”瓶子。换句话说,只有一个Bottle可以将其Default属性(datagrid中的复选框)设置为true。我已经处理过屏幕验证,但是我仍然需要为多用户场景处理DataServiceValidation。
如何获得清洁/脏实体的合并集合?请注意这是一个Visual Studio LightSwitch问题。
答案 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.");
}
}