C# 在必填字段C上警告用户#
我正在使用实体框架为我的项目开发一个frameworkish结构 我目前正在首先使用数据库,但如果需要,可能会将其更改为CodeFirst。所以我的问题是,我想给我的CRUD添加一些逻辑,我如何以一种通用的方式来实现这一点?有什么最佳实践吗?我已经在网上搜索过了,但是在这上面找不到任何东西 下面是一个示例,说明我需要什么: 假设我有一个带有以下字段的客户表C# 在必填字段C上警告用户#,c#,entity-framework,C#,Entity Framework,我正在使用实体框架为我的项目开发一个frameworkish结构 我目前正在首先使用数据库,但如果需要,可能会将其更改为CodeFirst。所以我的问题是,我想给我的CRUD添加一些逻辑,我如何以一种通用的方式来实现这一点?有什么最佳实践吗?我已经在网上搜索过了,但是在这上面找不到任何东西 下面是一个示例,说明我需要什么: 假设我有一个带有以下字段的客户表 C_ROWID(int)(主键)(AI)(非空) 客户识别码(int) C_是_员工(bool) C_作业_标题(字符串) 所以场景是这
- C_ROWID(int)(主键)(AI)(非空)
- 客户识别码(int)
- C_是_员工(bool)
- C_作业_标题(字符串)
那么你有什么建议 为强制选择所需的外键而执行的操作:
public class SomeDataEntity
{
public int PrimaryKey { get; set; }
[Required]
public int? ForeignKey { get; set; }
}
通过使用Nullable
,默认值将为null
当未选择任何内容且所需属性将被EF和典型验证技术识别时
另一个要求更为复杂
在数据库级别,您可以引入一个。确保选择适用于数据库的布尔比较和字符串比较。对于某些数据库,C\u JOB\u 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; }
}
通过使用Nullable
,默认值将为null
当未选择任何内容且所需属性将被EF和典型验证技术识别时
另一个要求更为复杂
在数据库级别,您可以引入一个。确保选择适用于数据库的布尔比较和字符串比较。对于某些数据库,C\u JOB\u 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;
}
}
用法
作为一个快速的回答,您可能需要某种依赖关系树。您将使用什么前端?如果您使用APS.NET MVC,您可以很容易地用验证规则装饰您的模型,并使用标准功能验证并向用户显示验证错误。非主题:如果Client\u Id
应该是主键(看起来像),请不要告诉用户为新条目提供它。让您的数据库生成它。作为一个用户,我到底为什么要为一个新条目提供一个数字,特别是因为我不知道哪些数字已经在使用?好吧,我已经更新了,这个例子。现在我有一个C_ROWID作为主键。我没有使用asp。我用的是C#winforms@oerkelens我的意思是在ai表上,我更新了我的问题“客户端id”字段用于用户的id卡号。作为快速回答,您可能需要某种依赖关系树。您将使用什么前端?如果您使用APS.NET MVC,您可以很容易地用验证规则装饰您的模型,并使用标准功能验证并向用户显示验证错误。非主题:如果Client\u Id
应该是主键(看起来像),请不要告诉用户为新条目提供它。让您的数据库生成它。作为一个用户,我到底为什么要为一个新条目提供一个数字,特别是因为我不知道哪些数字已经在使用?好吧,我已经更新了,这个例子。现在我有一个C_ROWID作为主键。我没有使用asp。我用的是C#winforms@oerkelens我的意思是,在ai表上,我更新了我的问题“客户端id”字段是针对用户的id卡号。这并没有回答问题:然后我还要强制用户输入作业title@GertArnold谢谢,我对一个问题的注意力不好,我将编辑:d这并没有回答问题:然后我还要强制用户输入作业title@GertArnold谢谢,我的错误集中在一个问题上,我将编辑:D