2个属性中的一个应该为null(EntityFramework Code First)

时间:2014-10-06 20:42:14

标签: entity-framework properties null data-annotations code-first

我在论坛上搜索了很多,但是没有找到关于这个问题的任何内容。

我在EntityFramework Code First中有2个属性:

    [Column(TypeName = "Money")]
    public decimal? Debit { get; set; }
    [Column(TypeName = "Money")]
    public decimal? Credit { get; set; }

其中一个不应为null,但另一个应该为null 例子:

Debit=null;
Credit=34;

Debit=45;
Credit=null;

另一方面,不应该将两者都设置为空或者不设置它们。 是否可以使用数据注释处理此问题,还是应该通过解决方法解决它?

祝你好运!

3 个答案:

答案 0 :(得分:5)

您总是可以使用约束

在数据库端进行验证
ALTER TABLE TableName 
    ADD CONSTRAINT OneColumnNull CHECK 
    ((Debit IS NULL AND Credit IS NOT NULL) OR 
     (Debit IS NOT NULL AND Credit IS NULL)
    )

完全符合您的要求。您可以将该查询作为其中一个数据库迁移脚本的一部分。

答案 1 :(得分:2)

我不知道如何使用available Code First Data Annotations.

执行此操作

您可以覆盖ValidateEntity类的DbContext方法,并为该类型的实体添加验证逻辑。

或者您可以为您的属性添加参数验证逻辑。

private decimal? _debit;
[Column(TypeName = "Money")]
public decimal? Debit
{
    get { return _debit; }
    set
    {
        // logic to check _credit against value 
        _debit = value;
    }
}
private decimal? _credit;
[Column(TypeName = "Money")]
public decimal? Credit
{
    get { return _credit; }
    set
    {
        // logic to check _debit against value 
        _credit = value;
    }
}

答案 2 :(得分:0)

在SQL Server中,数据库字段可以为空或不可为空。您的设计有时需要列为空,这意味着两者都必须是可为空的

替代品包括 使用零而不是null。

或者有一列Amount和另一列IsDebit

您还可以为您的班级编写属性,例如

[NonMapped]
public int? Credit
{ get 
 { if ( dataCredit == 0 ) return null; }
}