【问题标题】:EF Core entity not added to databaseEF Core 实体未添加到数据库
【发布时间】:2018-05-03 01:57:00
【问题描述】:

我的实体未添加到特定表中。

虽然其他所有表都运行良好,但我有一个特定的表不是,我无法找出原因。在相同的序列中,我在 SaveChangeAsync 之前有不同的添加/更新,每个查询都可以正常工作,除了一个未添加实体的表。

我已经检查了实体,它的数据填充得很好。

在调查了为什么我在这个表中没有数据之后,我使用即时窗口进行了一些测试,这是我得到的序列:

  1. 从表中计数
  2. 添加实体
  3. 保存DBContext
  4. 从表中计数

计数

_DbContext.Attendees.Count()
Microsoft.EntityFrameworkCore.Database.Command:Information: Executed DbCommand (17ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT COUNT(*)
FROM [Attendees] AS [e]
Application Insights Telemetry (unconfigured): {"name":"Microsoft.ApplicationInsights.Dev.Message","time":"2018-05-02T11:39:35.5327129Z","tags":{"ai.operation.parentId":"|d06def47-4faba4501b66147c.","ai.operation.id":"d06def47-4faba4501b66147c","ai.location.ip":"127.0.0.1","ai.operation.name":"POST Order/VerifyPayment [cartId]","ai.application.ver":"1.0.0.0","ai.internal.nodeName":"MyPC","ai.cloud.roleInstance":"MyPC","ai.internal.sdkVersion":"aspnet5c:2.1.1"},"data":{"baseType":"MessageData","baseData":{"ver":2,"message":"Executed DbCommand (17ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\r\nSELECT COUNT(*)\r\nFROM [Attendees] AS [e]","severityLevel":"Information","properties":{"{OriginalFormat}":"Executed DbCommand ({elapsed}ms) [Parameters=[{parameters}], CommandType='{commandType}', CommandTimeout='{commandTimeout}']{newLine}{commandText}","elapsed":"17","commandTimeout":"30","commandText":"SELECT COUNT(*)\r\nFROM [Attendees] AS [e]","AspNetCoreEnv
ironment":"Development","commandType":"Text","DeveloperMode":"true","CategoryName":"Microsoft.EntityFrameworkCore.Database.Command"}}}}
0

添加实体

_DbContext.Attendees.Add(attendees[0])
{Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalClrEntityEntry}
    Collections: {System.Linq.Enumerable.WhereSelectEnumerableIterator<Microsoft.EntityFrameworkCore.Metadata.INavigation, Microsoft.EntityFrameworkCore.ChangeTracking.CollectionEntry>}
    Context: {Project.Data.DbContext}
    CurrentValues: {Microsoft.EntityFrameworkCore.ChangeTracking.Internal.CurrentPropertyValues}
    Entity (Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry): {Project.Models.Attendee}
    Entity: {Project.Models.Attendee}
    InternalEntry: {Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalClrEntityEntry}
    IsKeySet: true
    Members: {System.Linq.Enumerable.Concat2Iterator<Microsoft.EntityFrameworkCore.ChangeTracking.MemberEntry>}
    Metadata: {EntityType: Attendee}
    Navigations: {System.Linq.Enumerable.SelectEnumerableIterator<Microsoft.EntityFrameworkCore.Metadata.INavigation, Microsoft.EntityFrameworkCore.ChangeTracking.NavigationEntry>}
    OriginalValues: {Microsoft.EntityFrameworkCore.ChangeTracking.Internal.OriginalPropertyValues}
    Properties: {System.Linq.Enumerable.SelectEnumerableIterator<Microsoft.EntityFrameworkCore.Metadata.IProperty, Microsoft.EntityFrameworkCore.ChangeTracking.PropertyEntry>}
    References: {System.Linq.Enumerable.WhereSelectEnumerableIterator<Microsoft.EntityFrameworkCore.Metadata.INavigation, Microsoft.EntityFrameworkCore.ChangeTracking.ReferenceEntry>}
    State: Added

保存更改

_DbContext.SaveChanges()
0

表数

_DbContext.Attendees.Count()
Microsoft.EntityFrameworkCore.Database.Command:Information: Executed DbCommand (19ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT COUNT(*)
FROM [Attendees] AS [e]
Application Insights Telemetry (unconfigured): {"name":"Microsoft.ApplicationInsights.Dev.Message","time":"2018-05-02T11:40:05.8741131Z","tags":{"ai.operation.parentId":"|d06def47-4faba4501b66147c.","ai.operation.id":"d06def47-4faba4501b66147c","ai.location.ip":"127.0.0.1","ai.operation.name":"POST Order/VerifyPayment [cartId]","ai.application.ver":"1.0.0.0","ai.internal.nodeName":"MyPC","ai.cloud.roleInstance":"MyPC","ai.internal.sdkVersion":"aspnet5c:2.1.1"},"data":{"baseType":"MessageData","baseData":{"ver":2,"message":"Executed DbCommand (19ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\r\nSELECT COUNT(*)\r\nFROM [Attendees] AS [e]","severityLevel":"Information","properties":{"{OriginalFormat}":"Executed DbCommand ({elapsed}ms) [Parameters=[{parameters}], CommandType='{commandType}', CommandTimeout='{commandTimeout}']{newLine}{commandText}","elapsed":"19","commandTimeout":"30","commandText":"SELECT COUNT(*)\r\nFROM [Attendees] AS [e]","AspNetCoreEnv
ironment":"Development","commandType":"Text","DeveloperMode":"true","CategoryName":"Microsoft.EntityFrameworkCore.Database.Command"}}}}
0

我们可以观察到,实体已成功附加,但在保存时,什么也没有发生……这可能是什么原因?它被声明为任何其他表。它有一个 Guid Id 作为键,在代码端设置

其他信息

_DbContext.ChangeTracker.Entries<Attendee>().Count() => 1

和

_DbContext.ChangeTracker.Entries<Attendee>().ElementAt(0).Entity

给出一个实体,具有一组唯一的 id 和许多其他在这种情况下不太感兴趣的字段。

Save 之后,Entries.Count 返回 0,但没有添加任何内容...

我已经删除了 SQL 中可能干扰的任何外键以及实体描述中除主键之外的任何键。

_DbContext.Attendees.FirstOrDefault() 运行 SQL 语句,由于 DB 中没有条目,按预期返回 null。

如果我这样做 _DbContext.Attendees.Add(new Attendee(){Id=Guid.NewId()}) 它会起作用...我将从那里开始...

【问题讨论】:

  • 你能显示你添加和保存的代码吗?我的意思是完整的控制器或服务
  • 嗯,SaveChanges的返回值就是它执行了多少次操作,这里显然是0。我真的想不出它不会保存的原因,除非存在数据库更新异常或实体已经存在(在这种情况下,EF 只会附加,而不是添加)。在后一种情况下,如果您尝试执行诸如复制实体之类的操作,则需要确保它已分离,然后在添加之前将 id 清零/清零。
  • @Riscie 隔离该信息会有点复杂:/
  • @ChrisPratt 你可以查看我添加的附加信息

标签: c# asp.net-core entity-framework-core


【解决方案1】:

不知何故,因为在Add 和UPDATE 调用之间存在SELECT 语句(ToListAsync 和FirstOrDefaultAsync)。 Add 声明之一在某处丢失,我找不到原因。

我的解决方案是创建一个新的DbContext,并仅保留此DbContext 语句,以更新某些实体并将这些SELECT 作为第一个语句移动所需的SELECT。

【讨论】:

    猜你喜欢
    • 2017-11-07
    • 1970-01-01
    • 2021-02-16
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多