EntityFramework 6(代码优先)问题SQL DB身份交互 - EF尝试在标识列中插入显式值

时间:2018-05-17 10:05:59

标签: c# sql-server entity-framework ef-core-2.0

我有一个SQL数据库,其中一个表由几列组成,带有'user_id'列,设置为PK和标识。

这是表格的代码:

CREATE TABLE [dbo].[Users] (
[user_id]   INT            IDENTITY (1, 1) NOT NULL,
[firstname] NVARCHAR (25)  NOT NULL,
[lastname]  NVARCHAR (25)  NOT NULL,
[title]     NVARCHAR (10)  NOT NULL,
[email]     NVARCHAR (50)  NOT NULL,
[password]  NVARCHAR (255) NOT NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([user_id] ASC)
);

尝试在DB中保存新对象时,会产生错误

SqlException: Cannot insert explicit value for identity column in table 
'Users' when IDENTITY_INSERT is set to OFF.

正在保存的对象没有'user_id'。

'user_id'的DBContext是:

entity.Property(e => e.UserId).HasColumnName("user_id");

并已由EFCorePowerTools自动生成。

实际的用户类具有属性'UserID',该属性绑定到DBContext中的'user_id'。

    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity), Key]
    public int UserId { get; set; }

我们的想法是让SQL DB处理密钥生成。

通过查询手动插入工作完美,因此问题必须在于EF实现。

到目前为止,我已经尝试过了:

使'User'中的'UserID'可以为空,

只有'[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]作为'UserID'的注释

重新构建数据库,然后重新构建DBContext

出于某种原因,即使用'NotMapped'注释'User'中的'UserID',我也会得到同样的错误,这让我相信实际的DBContext绑定存在问题。

以下是“用户”的完整DBContext:

modelBuilder.Entity<User>(entity =>
        {
            entity.Property(e => e.UserId).HasColumnName("user_id");

            entity.Property(e => e.Email)
                .IsRequired()
                .HasColumnName("email")
                .HasMaxLength(50);

            entity.Property(e => e.Firstname)
                .IsRequired()
                .HasColumnName("firstname")
                .HasMaxLength(25);

            entity.Property(e => e.Lastname)
                .IsRequired()
                .HasColumnName("lastname")
                .HasMaxLength(25);

            entity.Property(e => e.Password)
                .IsRequired()
                .HasColumnName("password")  
                .HasMaxLength(255);

            entity.Property(e => e.Title)
                .IsRequired()
                .HasColumnName("title")
                .HasMaxLength(10);
        });

所有'用户'类:

public partial class User : DomainAppBase, IStorable
{
    public User()
    {
        Leads = new HashSet<Lead>();
    }

    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Title { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }

    public override void SetDefaultValues()
    {
        UserId = NullKey;
    }

    [NotMapped]
    public ICollection<Lead> Leads { get; set; }
    [NotMapped]
    public new int Key => UserId;
}

任何帮助或指示都将非常感激。提前谢谢。

1 个答案:

答案 0 :(得分:0)

请将模型构建器更新为

modelBuilder.Entity<User>(entity =>
{
   entity.HasKey(o => o.UserId );
   entity.Property(e => e.UserId).ValueGeneratedOnAdd().HasColumnName("user_id")
 ...................

ValueGeneratedOnAdd可以在添加新实体时生成值。