我正在使用实体框架为我的项目开发一个框架结构 我目前正在使用数据库,但如果需要,可能会将其更改为CodeFirst。所以我的问题是我想在我的CRUDS中添加一些逻辑如何以通用方式执行此操作?有什么最佳做法吗?我在网上搜索但在这方面找不到任何东西。
这是一个展示我需要的例子: 假设我有一个 CLIENTS 表,其中包含以下字段
C_ROWID(int)(主键)(AI)(NOT_NULL)
C_CLIENT_ID(int)
C_IS_EMPLOYEED(bool)
C_JOB_TITLE(字符串)
因此情况如下:进行新注册时 用户需要输入C_CLIENT_ID
并且如果C_IS_EMPLOYED为真 那么我也想强迫用户输入客户的职称。
所以在上面的场景中,如果C_IS_EMPLOYEE为真并且用户将客户端ID和作业标题字段留空,我想向用户显示需要这些字段的警告,而不是保存信息。
那你的建议是什么?
答案 0 :(得分:0)
我为了强制选择所需的外键我做了什么:
public class SomeDataEntity
{
public int PrimaryKey { get; set; }
[Required]
public int? ForeignKey { get; set; }
}
使用Nullable
,默认值为null
当没有选择任何内容时,EF和典型的验证技术都会识别Required
属性。
另一个要求更复杂。
在数据库级别,您可以引入CHECK
constraint。确保选择适用于您的数据库的布尔比较和字符串比较。对于某些数据库,C_JOB_TITLE
可能仍为空,而不是NULL
。
CONSTRAINT CHK_JobTitle CHECK (C_IS_EMPLOYEED = 0 OR C_JOB_TITLE IS NOT NULL)
在应用程序级别,您可以开发一些自定义验证属性。以下只是一个非常粗略的粗略草图:
[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
sealed class RequiredIfAttribute : ValidationAttribute
{
readonly string boolPropertyName;
public RequiredIfAttribute(string boolPropertyName)
{
this.boolPropertyName = boolPropertyName;
throw new NotImplementedException();
}
public string BoolPropertyName
{
get { return boolPropertyName; }
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var prop = validationContext.ObjectType.GetProperty(BoolPropertyName);
if (prop == null)
{
throw new ValidationException("Property not found: " + BoolPropertyName);
}
var condition = prop.GetValue(validationContext.ObjectInstance) as bool?;
if (condition == true && string.IsNullOrEmpty(value as string))
{
return new ValidationResult("Required: " + validationContext.MemberName);
}
return ValidationResult.Success;
}
}
用法
public class SomeDataEntity
{
public int PrimaryKey { get; set; }
[Required]
public int? ForeignKey { get; set; }
public bool C_IS_EMPLOYEED { get; set; }
[RequiredIf("C_IS_EMPLOYEED")]
public string C_JOB_TITLE { get; set; }
}