0

使用EFCore,该模型具有一个带有外键约束的表,它引用另一个表,但该列为,可为空。模型是这样的:DbSet.Add忽略未设置的属性

public class Order 
{ 
    [Key] 
    public int Id { get; set; } 
    public int Code { get; set; } 
    public int Amount { get; set; } 
    ... // other fields 
} 
public class OrderCode 
{ 
    [Key] 
    public int Id { get; set; } 
    public int Code { get; set; } 
    public string Description { get; set; } 
} 

Order o = new Order { Amount = 1 }; // Code is not set and default NULL in DB 
orders.Add(o); 
db.SaveChanges(); // failure 

所以对一些情况下,Code是空的,它是默认NULL在数据库中,但是当我通过DbSet.Add添加的对象,它抛出一个异常:

Microsoft.EntityFrameworkCore .DbUpdateException:更新条目时发生错误。详情请参阅内部例外。 ---> System.Data.SqlClient.SqlException:INSERT语句与FOREIGN KEY约束“FK_Orders_Code”冲突。数据库“Store”中发生冲突,表“dbo.OrderCode”,列'Id'。

看来EFCore会尝试在插入语句中添加此字段,即使它没有设置,那么有什么办法可以避免这种情况?

回答

1

我认为你应该使用int?代码在你的模型中。 int的默认值是0,所以实体框架为Code字段设置。

public class Order 
{ 
    [Key] 
    public int Id { get; set; } 
    public int? Code { get; set; } 
    public int Amount { get; set; } 
    ... // other fields 
} 
+0

但随后在使用此字段的代码中的任何地方都需要更新为foo.Value,并且还要使用foo.HasValue进行检查。有更好的选择吗? – fluter