实体框架列 - 实体关联?

时间:2016-04-13 18:57:19

标签: c# entity-framework

我是EF的新手,我突然遇到问题:

        var _entity = new TestEntity();

        _entity.Customers.Add(new Customers { Description = "John" });
        _entity.Customers.Add(new Customers { Customer_ID = 1, Description = "Steve" });

        try
        {
            _entity.SaveChanges();
        }
        catch (System.Data.Entity.Validation.DbEntityValidationException)
        {
            Debug.Print("Validation Error");
        }

运行此代码后,我得到了一个没有任何异常的两个记录的结果,但我的问题是Customer_ID字段不允许null或定义任何默认值。但是,“John”-record已插入Customer_ID:0。 (当然,“史蒂夫”也记录了正确的ID:1)

如何在插入值之前设法抛出预期,或者至少更深入地验证,如果没有通过代码定义,请远离插入?

模型类在这里:

    [Key]
    [Column(Order = 0)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Customer_ID { get; set; }

    [Column(Order = 1)] 
    [StringLength(50)] 
    public string Description { get; set; }

谢谢

4 个答案:

答案 0 :(得分:1)

int的默认值为0,它不为null,您可以将其插入到DB中。如果您想检查Customer_ID是否被指定为大于0的值,您可以尝试Range属性。

[Key]
[Column(Order = 0)] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
[Range(1, Int32.MaxValue, ErrorMessage = "Value for {0} must be larger than 0.")]
public int Customer_ID { get; set; }

另一个丑陋的解决方案可能是标记将属性类型更改为int?并应用Required属性,如下所示:

[Key]
[Column(Order = 0)] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
[Required]
public int? Customer_ID { get; set; }

答案 1 :(得分:1)

好的,我明白了。

所以我应该将值标记为可空:

[Key]
[Column(Order = 0)] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
public int? Customer_ID { get; set; }

在这种情况下,我刚刚得到了一个DbUpdateException。也许是一个解决方案,但可能不是最好的,所以其他建议仍然受欢迎。

答案 2 :(得分:1)

在数据库方面,我强烈建议在Customer_ID上设置CHECK约束,使其不允许为0.这样可以防止应用程序中的错误泄漏到数据库中。

答案 3 :(得分:-1)

目前尚不清楚您是否希望Customer_ID接受null? public int Customer_ID {get;组;默认值为0,所以你得到的是正确的。

如果需要,请尝试:

[Required]
public int Customer_ID { get; set; }

如果它可以为null

public int? Customer_ID { get; set; }