我是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; }
谢谢
答案 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; }