c# - 如何使用 Entity Framework Core 将属性设置为 "Identity"或自动递增的列?

标签 c# wpf entity-framework entity-framework-core

在我使用 C# 编写的新 WPF 项目中,我想尝试使用 Entity Framework Core与我的 SQL Server 数据库交互。

每次我尝试将模型添加到我的上下文中时,我都会收到以下错误

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

我正在使用 RepositoryUnitOfWork 包装 Entity Framework Core 方法来执行所需的工作。

但在最简单的情况下,我正在执行以下代码

var order = new Order();
order.Title = "some";
....
Context.Orders.Add(order);
Context.SaveChanges();

这是我的模型

public class Order
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Int64 Id { get; set; }

    public string Status { get; set; }
    public int? CustomerId { get; set; }
    public DateTime? Birthdate { get; set; }
    public int UtcOffset { get; set; }\
    public DateTime CreatedAt { get; set; }
    public DateTime? UpdatedAt { get; set; }
    public int? UpdatedBy { get; set; }

    [ForeignKey(nameof(Creator))]
    public int CreatedBy { get; set; }

    public Order()
    {
        CreatedAt = DateTime.UtcNow;
    }

    public virtual User Creator { get; set; }
    public virtual Customer Customer { get; set; }
}

是什么导致了这个问题?

已更新

这是我的表是如何创建的

CREATE TABLE [dbo].[Orders](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [Status] [varchar](50) NOT NULL,
    [CustomerId] [int] NULL,
    [Birthdate] [datetime] NULL,
    [CreatedBy] [int] NOT NULL,
    [CreatedAt] [datetime] NOT NULL,
    [UpdatedBy] [int] NULL,
    [UpdatedAt] [datetime] NULL,
    [UtcOffset] [int] NOT NULL,
 CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

下面是创建Order模型的方法

public Order Create(int? customerId, DateTime? birthdate)
{
    var order = new Order();
    order.CustomerId = customerId;
    order.Birthdate = birthdate;
    order.Status = OrderStatus.Sold.ToString();
    order.CreatedBy = Passport.Identity.Id;

    var updatedOrder = Orders.Add(order);
    Orders.Save();

    return updatedOrder;
}

这是我的存储库实现

public class EntityRepository<TEntity, TKeyType> : IRepository<TEntity, TKeyType>
    where TEntity : class
    where TKeyType : struct
{
    protected readonly DbContext Context;
    protected readonly DbSet<TEntity> DbSet;

    public EntityRepository(DbContext context)
    {
        Context = context;
        DbSet = context.Set<TEntity>();
    }

    public TEntity Get(TKeyType id)
    {
        return DbSet.Find(id);
    }

    public IEnumerable<TEntity> GetAll()
    {
        return DbSet.ToList();
    }

    public bool Any(Expression<Func<TEntity, bool>> predicate)
    {
        return DbSet.Any(predicate);
    }

    public IQueryable<TEntity> Find(Expression<Func<TEntity, bool>> predicate)
    {
        return DbSet.Where(predicate);
    }

    public TEntity SingleOrDefault(Expression<Func<TEntity, bool>> predicate)
    {
        return DbSet.SingleOrDefault(predicate);
    }

    public virtual TEntity Add(TEntity entity)
    {
        DbSet.Add(entity);

        return entity;
    }

    public virtual IEnumerable<TEntity> AddRange(IEnumerable<TEntity> entities)
    {
        DbSet.AddRange(entities);

        return entities;
    }

    public void Remove(TEntity entity)
    {
        DbSet.Remove(entity);
    }

    public void RemoveRange(IEnumerable<TEntity> entities)
    {
        DbSet.RemoveRange(entities);
    }

    public void Update(TEntity entity)
    {
        DbSet.Attach(entity);
        var record = Context.Entry(entity);
        record.State = EntityState.Modified;
    }

    public IQueryable<TEntity> Query()
    {
        return DbSet;
    }

    public void Save()
    {
        Context.SaveChanges();
    }
}

public class EntityRepository<TEntity> : EntityRepository<TEntity, int>
   where TEntity : class
{
    public EntityRepository(DbContext context)
        : base(context)
    {
    }
}

此外,这个问题在 Entity Framework error: Cannot insert explicit value for identity column in table 上不是重复的因为我正在使用 [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 装饰我的 Id 属性。此外,我使用的是数据库优先方法,所以我使用 MSSMS 手动创建了数据库

最佳答案

在我的例子中,我必须将 entity.Property(e => e.TranId).ValueGeneratedOnAdd(); 添加到我的上下文文件中。

modelBuilder.Entity<PersonalTrades>(entity =>
{
     entity.Property(e => e.TranId).ValueGeneratedOnAdd();
}

我没有从 Automapper 更新身份字段 (TranId)。最后,上述更改对我有用,正如名称指定的那样,它在插入记录时为身份字段生成值。

关于c# - 如何使用 Entity Framework Core 将属性设置为 "Identity"或自动递增的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50440713/

相关文章:

c# - 在 WPF 数据网格中查找行的高度

wpf - 已在编译时检测 XAML 中损坏的绑定(bind)

c# - linq toentity datediff 单元测试失败,但 sql 数据失败

c# - EntityType 没有定义键

c# - 命名空间和使用范围解析

c# - 等待来自 SendGrid 的 API 返回代码时应用程序卡住

c# - 切换到更改 LINQ 查询

c# - 如何自动附加到十进制数据类型 DisplayFormatAttribute

c# - 使用按钮单击 c# 在列表框中选择多个项目

c# - SlowCheetah 没有为 EntityFramework 迁移进行转换