【发布时间】:2017-08-12 19:22:40
【问题描述】:
我有两张桌子Client 和ClientSecret。这些表具有以下结构:
public class Client
{
public int Id { get; set; }
public string ClientId { get; set; }
public string ClientName { get; set; }
public List<ClientSecret> ClientSecrets { get; set; }
}
public class ClientSecret
{
public int Id { get; set; }
public string Description { get; set; }
public string Value { get; set; }
public DateTime? Expiration { get; set; }
public Client Client { get; set; }
}
我需要创建一个新的Client 设置ClientId 和ClientName 并从数据库中取回该对象的新Id。
我已经尝试过了(_dbContext 是通过构造函数中的 DI 系统获取的):
var newClient = new Client();
newClient.ClientName = client.ClientName;
newClient.ClientId = client.ClientId;
_dbContext.Clients.Add(newClient);
await _dbContext.SaveChangesAsync();
var newClientId = newClient.Id;
var clientToUpdate = await _dbContext.Clients.Where(x => x.Id == newClientId).SingleOrDefaultAsync();
clientToUpdate.ClientSecrets.AddRange(secrets);
_dbContext.Clients.Update(clientToUpdate);
await _dbContext.SaveChangesAsync();
我需要首先创建一个Client,因为表ClientSecrets 需要一个ClientId 来在该表中创建新记录。
我收到此错误消息:
在行中失败:_dbContext.Clients.Update(clientToUpdate);
InvalidOperationException:实体类型“客户端”的实例不能 被跟踪,因为此类型的另一个具有相同键的实例是 已经被追踪。添加新实体时,对于大多数键类型 如果没有设置键(即如果 键属性为其类型分配了默认值)。如果你 正在为新实体显式设置键值,确保它们不会 与现有实体或为其他生成的临时值发生冲突 新实体。附加现有实体时,确保只有一个 具有给定键值的实体实例附加到上下文。
我该如何解决这个问题?
【问题讨论】:
-
您正在使用 EF Core,就像您在编写原始 sql 查询时一样,这比 ORM 的许多优势都强
标签: c# entity-framework asp.net-core entity-framework-core