当 IDENTITY_INSERT 设置为 OFF 时,无法为标识列插入显式值。 (实体框架核心)

2024-04-26

当我尝试将新实体添加到数据库中时,出现此错误。实体名称是DestuffedContainer。该实体及相关实体的定义如下:

去填充容器:

[Table("DestuffedContainer")]
public class DestuffedContainer
{
    public long DestuffedContainerId { get; set; }
    public int Index { get; set; }
    public string Description { get; set; }
    public int? PackageQuantity { get; set; }
    public string PackageType { get; set; }
    public double? CBM { get; set; }
    public string Location { get; set; }
    public string MarksAndNumber { get; set; }
    public int? ManifestWeight { get; set; }
    public int? FoundWeight { get; set; }
    public int? ManifestQuantity { get; set; }
    public string ConsigneeName { get; set; }
    public string Remarks { get; set; }
    public string InvoiceFound { get; set; }
    public string PackageFound { get; set; }
    public long TellySheetId { get; set; }
    public TellySheet TellySheet { get; set; }
    public long ContainerIndexId { get; set; }
    public ContainerIndex ContainerIndex { get; set; }
}

电视表:

[Table("TellySheet")]
public class TellySheet
{
    public TellySheet()
    {
        DestuffedContainers = new List<DestuffedContainer>();
    }

    public long TellySheetId { get; set; }
    public string TellyClerk { get; set; }
    public DateTime? DestuffDate { get; set; }
    public string DayNight { get; set; }
    public long ShippingAgentId { get; set; }
    public ShippingAgent ShippingAgent { get; set; }

    public List<DestuffedContainer> DestuffedContainers { get; set; }
}

容器索引:

[Table("ContainerIndex")]
public class ContainerIndex
{
    public long ContainerIndexId { get; set; }
    public string BLNo { get; set; }
    public int? IndexNo { get; set; }
    public double? BLGrossWeight { get; set; }
    public string Description { get; set; }
    public string MarksAndNumber { get; set; }
    public string ShippingLine { get; set; }
    public bool? IsDestuffed { get; set; }
    public string AuctionLotNo { get; set; }
    public long? ContainerId { get; set; }

    public Container Container { get; set; }
    public DeliveryOrder DeliveryOrder { get; set; }
    public OrderDetail OrderDetail { get; set; }
    public DestuffedContainer DestuffedContainer { get; set; }
    public Auction Auction { get; set; }
}

当我尝试添加已卸料的容器列表时,以下代码行中出现错误:

 var dstfContainers = new List<DestuffedContainer>();
 _tellySheetRepo.Add(tellySheet);

 foreach (var container in containers)
 {
     var destuff = new DestuffedContainer
            {
                TellySheetId = tellySheet.TellySheetId,
                ContainerIndexId = container.ContainerIndexId,
                Index = container.IndexNumber ?? 0,
                Description = container.Description,
                PackageQuantity = container.Package,
                PackageType = container.PackageType,
                CBM = container.CBM,
                ManifestWeight = container.ManifestWeight > 0 ? Convert.ToInt32(container.ManifestWeight) : 0,
                FoundWeight = container.FoundWeight > 0 ? Convert.ToInt32(container.FoundWeight) : 0,
                MarksAndNumber = container.MarksAndNumber,
                Location = container.Location,
                Remarks = container.Remarks,
                InvoiceFound = container.InvoiceFoud,
                PackageFound = container.PackageFoud
            };

    dstfContainers.Add(destuff);

    var index = _cIndexRepo.Find(container.ContainerIndexId);

    if (index != null)
    {
        index.IsDestuffed = true;
        _cIndexRepo.Update(index);
    }
}

_destuffRepo.AddRange(dstfContainers);

我不确定这个错误意味着什么,因为我没有明确指定 destuffedcontainer 实体的主键值,默认情况下它是 0。实体框架应该将其作为插入,但它会抛出错误。

几天前它工作正常,但我不确定自从导致此错误以来发生了什么变化。

我正在使用 Entity Framework Core 来对我的实体进行建模。我尝试了几种解决方案,但似乎都不起作用。如果您能帮助解决此问题,我将不胜感激。

EDIT

似乎当我将 DestuffedContainer 表中的外键 ContainerIndexId 值分配给实体时,出现此错误。我不确定它有什么关系。


该错误表明您无法在 IDENTITY 列上插入数据,因为这样做已被禁用。

您可以通过执行以下操作来启用此行为

SET IDENTITY_INSERT [ [ database_name . ] schema_name . ] table_name { ON | OFF }

MSDN链接 https://learn.microsoft.com/en-us/sql/t-sql/statements/set-identity-insert-transact-sql?view=sql-server-2017

当您使用实体框架核心时,您必须:

context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.DestuffedContainer ON");
context.SaveChanges();
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.DestuffedContainer OFF");

> SQL Server IDENTITY 列中的显式值 https://learn.microsoft.com/en-us/ef/core/saving/explicit-values-generated-properties#explicit-values-into-sql-server-identity-columns

EDIT很抱歉,我不明白您没有提供价值。

然后确保您的列被标记为模型的 IDENTITY。我看到您正在使用属性来告诉 efcore 如何命名您的表。只要你不使用传统的Id您的关键属性的名称,您需要使用来明确它[Key]实体类上的属性,位于属性之上,例如:

[Key]
public long DestuffedContainerId { get; set; }

或者在上下文类中使用 FluentAPI:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
 ...
    modelBuilder
    .Entity<DestuffedContainer>()
    .Property(d => d.DestuffedContainerId)
    .ValueGeneratedOnAdd() 

    modelBuilder
    .Entity<DestuffedContainer>()
    .HasKey(d => d.DestuffedContainerId)
 ...
}

还要检查 sql server 表定义并确保名为您的属性的字段设置为IDENTITY,考虑到您遇到的错误,这是肯定的,但值得检查。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 IDENTITY_INSERT 设置为 OFF 时,无法为标识列插入显式值。 (实体框架核心) 的相关文章

随机推荐