c# - 当值不为空时无法将 NULL 插入列中

标签 c# sql asp.net entity-framework

所以我在尝试向实体添加实例时遇到了这个奇怪的问题。它是一个使用 EF 6.0 的 asp.net 应用程序。

异常(exception):

SqlException: Cannot insert the value NULL into column 'OrderId', table 'BETA.MDF.dbo.Orders'; column does not allow nulls. INSERT fails. The statement has been terminated.

我的代码:

User user = (User)Session["CurrentUser"];
BetaEntities entities = new BetaEntities();

Beta.Order order = new Beta.Order();
order.OrderId = Guid.NewGuid().ToString();
order.OrderDate = DateTime.Now;
order.OrderedBy = user.UserId;
order.HandledBy = entities.Users.Where(x => x.Rank > 0).Select(i => i.UserId).FirstOrDefault();

entities.Orders.Add(order);

entities.SaveChanges();

我的 table : enter image description here

这也是我的订单类,我已经尝试过[Database generated]

public partial class Order
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public string OrderId { get; set; }
    public System.DateTime OrderDate { get; set; }
    public int OrderedBy { get; set; }
    public int HandledBy { get; set; }
}

示例条目:

enter image description here 如果您需要更多详细信息,请告诉我。

编辑:

我尝试将 OrderID 的数据库数据类型设置为 UNIQUEIDENTIEFIER 并更新实体模型,以便数据库应该生成 guid(我删除了自身,但仍然遇到相同的异常。

这是我的新类(class):

public partial class Order
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public System.Guid OrderId { get; set; }
    public System.DateTime OrderDate { get; set; }
    public int OrderedBy { get; set; }
    public int HandledBy { get; set; }
}

enter image description here

enter image description here

编辑:

如果我将 OrderID 设为 NULLABALE 并删除主键,则会出现以下异常:

System.Data.Entity.Infrastruct.DbUpdateConcurrencyException:“存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体以来,实体可能已被修改或删除。请参阅http://go.microsoft.com/fwlink/?LinkId=472540有关理解和处理乐观并发异常的信息。'

但这可以通过添加主键来解决:(因此删除 PK 并将其设为 NULLABLE 是行不通的。

此外,为了进一步的目的,我需要自己分配 GUID,因此让数据库自己分配 GUID(使用 [DatabaseGenerate(DatabaseGenerateOption.Identity)])也不是一个选项。

最佳答案

你的问题是你设置了DatabaseGenerated属性为OrderId专栏。

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string OrderId { get; set; }

使用此属性 EF 将忽略您设置为 OrderId 的值和“尝试”生成唯一值,但生成唯一值不适用于 stringOrderId将是NULLINSERT生成查询。

如果您使用 EF“代码优先”,则更改 OrderId 的类型至Guid并从代码中删除下一行

order.OrderId = Guid.NewGuid().ToString();  

然后离开DatabaseGenerated属性原样。
使用时DatabaseGenerated列的属性 - 表示该列的值将由数据库生成。

更改 Order 的结构后类,您需要相应地更新数据库。如果您使用“代码优先”方法,那么您需要生成迁移脚本并针对数据库运行它。在“数据库优先”方法中,您需要手动更新数据库

即使你说删除 DatabaseGenerated属性没有帮助,这将是 Ivan Stoev 在评论中建议的最简单的解决方案。
因为您使用 Guid.NewGuid().ToString() 自己生成唯一的字符串.

关于c# - 当值不为空时无法将 NULL 插入列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43157126/

相关文章:

c# - 是否在扩展方法类中调用扩展方法?

sql - 防止递归 CTE 多次访问节点

asp.net - raisePropertyChanged 事件有什么用?

jquery - 如何在 ASP.NET 的代码隐藏中创建 jquery 日期选择器?

c# - 在数据表上使用通用列表会减少性能开销吗?

c# - 线程和锁定资源

c# - 哪些实际应用程序使用 Windows Workflow Foundation 技术?

php - 插入查询未向数据库中插入任何内容

C# MS Access oledbcommand.executeNonQuery UPDATE 没有错误,没有变化

c# - 当其他单元格更改时更新 DataGrid 中的单元格