C# 无法将数据保存到数据库中,因为Identity Insert设置为off

C# 无法将数据保存到数据库中,因为Identity Insert设置为off,c#,sql-server,entity-framework,metadata,identity-insert,C#,Sql Server,Entity Framework,Metadata,Identity Insert,我已经研究了这个问题的几个问题,但其中许多问题可以通过快速类注释来解决,但是我正在为类文件使用元数据,因此我必须使用ModelBuilder从类配置数据库中的关系。我已经知道问题是什么,我的表不能插入Id数据,但我不确定在当前场景中如何更改,因为我正在使用元数据。我将仔细阅读下面的代码,向您展示为什么这是不同的 这是我的密码 public class CrayonDbContext : DbContext { private const string co

我已经研究了这个问题的几个问题,但其中许多问题可以通过快速类注释来解决,但是我正在为类文件使用元数据,因此我必须使用ModelBuilder从类配置数据库中的关系。我已经知道问题是什么,我的表不能插入Id数据,但我不确定在当前场景中如何更改,因为我正在使用元数据。我将仔细阅读下面的代码,向您展示为什么这是不同的

这是我的密码

public class CrayonDbContext : DbContext
        {
            private const string connectionString = @"myserver";
    
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                optionsBuilder.UseSqlServer(connectionString);
            }
    
            public DbSet<BillingStatement> BillingStatements { get; set; }
    
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
    
                modelBuilder.Entity<BillingStatement>().OwnsOne<Price>(s => s.TotalSalesPrice);
                modelBuilder.Entity<BillingStatement>().OwnsOne<ObjectReference>(s => s.InvoiceProfile);
                modelBuilder.Entity<BillingStatement>().OwnsOne<ObjectReference>(s => s.Organization);

                base.OnModelCreating(modelBuilder);
            }
        }
下面是前面显示的billing statement类中引用的类

public class Price
{
    public Price();

    public decimal Value { get; set; }
    public string CurrencyCode { get; set; }
}

public class ObjectReference
{
    public ObjectReference();

    public int Id { get; set; }
    public string Name { get; set; }
}

public enum ProvisionType
{
    None = 0,
    Seat = 1,
    Usage = 2,
    OneTime = 3,
    Crayon = 4,
    AzureMarketplace = 5
}
这是正在生成的当前表

CREATE TABLE [BillingStatement] (
      [Id] int NOT NULL IDENTITY,
      [TotalSalesPrice_Value] decimal(18,2) NULL,
      [TotalSalesPrice_CurrencyCode] nvarchar(max) NULL,
      [InvoiceProfile_Id] int NULL,
      [InvoiceProfile_Name] nvarchar(max) NULL,
      [Organization_Id] int NULL,
      [Organization_Name] nvarchar(max) NULL,
      [StartDate] datetimeoffset NOT NULL,
      [EndDate] datetimeoffset NOT NULL,
      [ProvisionType] int NOT NULL,
      CONSTRAINT [PK_BillingStatement] PRIMARY KEY ([Id])
  );
现在的问题是,我无法将API数据保存到数据库中。这是我的billing statement的主要类,它通过Crayon NuGet包获取API数据,并将其存储到SQL server中

private static void BillingStatement()
{
var billingStatements = ApiClient.BillingStatements.Get(GetToken(), new BillingStatementFilter { OrganizationId = organization.Id }).GetData().Items;
using (var db = new CrayonDbContext())
            {
                db.BillingStatements.AddRange(billingStatements);
                db.SaveChanges();
            }
}
var billingStatements正确地携带了数据,我可以通过调试模式看到这一点。数据也已正确构建,但是当我运行应用程序并尝试将API数据保存到Db时,会出现此错误

内部异常1: SqlException:当identity\u insert设置为OFF时,无法在表“BillingStatements”中为identity列插入显式值


在我目前的情况下,我找不到纠正这一点的方法。我已尝试在上添加db.Database.ExecuteSqlRawSET IDENTITY\u INSERT dbo.BillingStatement;但我在ExecuteSqlRaw中遇到了一个错误,原因是Visual Studio无法识别它。有没有办法解决代码中的这个问题,以便将数据保存到表中?感谢您的帮助。

感谢史蒂夫·福特在评论中给出的答案

事实证明,我可以添加ModelBuilder解决方案。我在DbContext上实现了这一点:

modelBuilder.Entity.Propertyb=>b.Id.ValueGeneratedNever


这很有效,谢谢你。对于其他有类似问题的人,请尝试该解决方案。

您可以在模型生成器中使用.ValueGeneratedOnAdd-在写出如此大的问题后,请参阅@SteveFord Lol。这真的很简单,非常感谢Steve,我非常感谢。
private static void BillingStatement()
{
var billingStatements = ApiClient.BillingStatements.Get(GetToken(), new BillingStatementFilter { OrganizationId = organization.Id }).GetData().Items;
using (var db = new CrayonDbContext())
            {
                db.BillingStatements.AddRange(billingStatements);
                db.SaveChanges();
            }
}