繁体   English   中英

当值不为null时,无法将NULL插入列

[英]Cannot insert NULL into column while value is not null

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

例外:

SqlException:无法将值NULL插入到'OrderId'列中,表'BETA.MDF.dbo.Orders'; 列不允许空值。 INSERT失败。 该语句已终止。

我的代码:

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();

我的桌子: 在此输入图像描述

这也是我的订单类,我已经尝试了[Databasegenerated]

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; }
}

示例条目:

在此输入图像描述 如果您需要更多详细信息,请告诉我。

编辑:

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

这是我的新课程:

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; }
}

在此输入图像描述

在此输入图像描述

编辑:

如果我使OrderID为NULLABALE并删除主键,我会得到以下异常:

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

但这可以通过添加主键来解决:(因此删除PK并使其无效也无法正常工作。

此外,我需要自己分配给GUID用于进一步的目的,所以让数据库分配guid本身( [DatabaseGenerated(DatabaseGeneratedOption.Identity)] )也不是一个选项。

您的问题是您将DatabaseGenerated属性设置为OrderId列。

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

使用此属性,EF将忽略您设置为OrderId值并“尝试”生成唯一值,但生成唯一值将不适用于string并且在生成INSERT查询时OrderId将为NULL

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

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

并保留DatabaseGenerated属性。
对列使用DatabaseGenerated属性时 - 表示此列的值将由数据库生成。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM