【发布时间】:2018-05-03 01:57:00
【问题描述】:
我的实体未添加到特定表中。
虽然其他所有表都运行良好,但我有一个特定的表不是,我无法找出原因。在相同的序列中,我在 SaveChangeAsync 之前有不同的添加/更新,每个查询都可以正常工作,除了一个未添加实体的表。
我已经检查了实体,它的数据填充得很好。
在调查了为什么我在这个表中没有数据之后,我使用即时窗口进行了一些测试,这是我得到的序列:
- 从表中计数
- 添加实体
- 保存
DBContext - 从表中计数
计数
_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