Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在必填字段C上警告用户#_C#_Entity Framework - Fatal编程技术网

C# 在必填字段C上警告用户#

C# 在必填字段C上警告用户#,c#,entity-framework,C#,Entity Framework,我正在使用实体框架为我的项目开发一个frameworkish结构 我目前正在首先使用数据库,但如果需要,可能会将其更改为CodeFirst。所以我的问题是,我想给我的CRUD添加一些逻辑,我如何以一种通用的方式来实现这一点?有什么最佳实践吗?我已经在网上搜索过了,但是在这上面找不到任何东西 下面是一个示例,说明我需要什么: 假设我有一个带有以下字段的客户表 C_ROWID(int)(主键)(AI)(非空) 客户识别码(int) C_是_员工(bool) C_作业_标题(字符串) 所以场景是这

我正在使用实体框架为我的项目开发一个frameworkish结构 我目前正在首先使用数据库,但如果需要,可能会将其更改为CodeFirst。所以我的问题是,我想给我的CRUD添加一些逻辑,我如何以一种通用的方式来实现这一点?有什么最佳实践吗?我已经在网上搜索过了,但是在这上面找不到任何东西

下面是一个示例,说明我需要什么: 假设我有一个带有以下字段的客户

  • C_ROWID(int)(主键)(AI)(非空)

  • 客户识别码(int)

  • C_是_员工(bool)

  • C_作业_标题(字符串)

所以场景是这样的:当进行新注册时 用户需要输入C_客户端ID

如果C_是,那么C_是真的 然后,我还要强制用户输入客户的职务

因此,在上面的场景中,如果C_IS_EMPLOYEE为true,并且用户将客户id和职务标题字段留空,我希望向用户显示一条警告,这些字段是必需的,而不是保存信息


那么你有什么建议

为强制选择所需的外键而执行的操作:

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