两个属性中必须有一个为空(EntityFramework Code First)

8

我在论坛上进行了很多搜索,但没有找到关于这个问题的任何信息。

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

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

其中一个应该不为空,但另一个应该为空。 例如:
Debit=null;
Credit=34;

Debit=45;
Credit=null;

另一方面,不应该同时设置它们为空或都不为空。是否可以使用数据注释来解决此问题,或者应该使用一些变通方法?祝好!

你可以通过约束在数据库端进行验证,ALTER TABLE TableName ADD CONSTRAINT OneColumnNull CHECK ((Debit IS NULL AND Credit IS NOT NULL) OR (Debit IS NOT NULL AND Credit IS NULL)) 正好符合你的要求。你可以将该查询作为数据库迁移脚本的一部分。 - Scott Chamberlain
@ScottChamberlain 非常感谢,就是这样 :) - ComFreakDomi
你的建模有问题,你的Payment表应该与另一个名为"PaymentType"的表建立关联,其中包括"credit"和"debit"作为行。 - Heitor Giacomini
3个回答

8

您可以始终使用约束在数据库端执行验证

ALTER TABLE TableName 
    ADD CONSTRAINT OneColumnNull CHECK 
    ((Debit IS NULL AND Credit IS NOT NULL) OR 
     (Debit IS NOT NULL AND Credit IS NULL)
    )

该功能正好符合您的要求。您可以将此查询作为数据库迁移脚本的一部分。


2
我不明白你如何使用可用的Code First数据注释来完成这个任务。
你可以重写DbContext类的ValidateEntity方法,并添加该类型实体的验证逻辑。
或者,你可以为你的属性添加参数验证逻辑。
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;
    }
}

0
在SQL Server中,数据库字段可以是可空或不可空的。您的设计要求有时必须将列设置为可空,这意味着两个都必须是可空的。
替代方案包括使用零而不是null。
或者有一个列Amount和另一个列IsDebit。
您还可以为类编写属性,例如:
[NonMapped]
public int? Credit
{ get 
 { if ( dataCredit == 0 ) return null; }
}

1
你的想法有误,两列仍然可为空,就好像有人运行了 ALTER TABLE TableName ADD CONSTRAINT OneColumnNull CHECK ((Debit IS NULL AND Credit IS NOT NULL) OR (Debit IS NOT NULL AND Credit IS NULL))。这里是它在 SqlFiddle 中的使用。 - Scott Chamberlain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接