【发布时间】:2018-05-03 17:11:44
【问题描述】:
我有以下代码,我正在尝试使用 ef core 更新 ClientAccount,但它们的并发检查失败:
public class ClientAccount
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[Required]
[ConcurrencyCheck]
public double Balance { get; set; }
[Required]
public DateTime DateTimeCreated { get; set; }
[Required]
public DateTime DateTimeUpdated { get; set; }
}
public class ClientRepository
{
private readonly MyContext context;
public ClientRepository(MyContext context)
{
this.context = context;
}
public ClientAccount GetClientAccount()
{
return (from client in context.ClientAccount
select client).SingleOrDefault();
}
public void Update(ClientAccount client)
{
context.Update(client);
context.Entry(client).Property(x => x.DateTimeCreated).IsModified = false;
}
}
public class ClientService
{
private readonly ClientRepository clientRepository;
private readonly IUnitOfWork unitOfWork;
public ClientService(ClientRepository clientRepository,
IUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
this.clientRepository = clientRepository;
}
public void Update(ClientAccount clientAccount)
{
if (clientAccount == null)
return;
try
{
ClientAccount existingClient = clientRepository.GetClientAccount();
if (existingClient == null)
{
// COde to create client
}
else
{
existingClient.AvailableFunds = clientAccount.Balance;
existingClient.DateTimeUpdated = DateTime.UtcNow;
clientRepository.Update(existingClient);
}
unitOfWork.Commit();
}
catch (DbUpdateConcurrencyException ex)
{
}
}
}
问题是DbUpdateConcurrencyException 不会在两个线程同时尝试更新它时被触发,因此我没有预期的功能。
我不明白这里有什么问题,因为用 ConcurrencyCheck 属性标记属性应该可以完成工作。
【问题讨论】:
-
有人可以帮忙吗?
-
在 cmets 中寻求帮助并不是很有用。它不会将问题推回到首页。编辑你的问题。例如添加执行实际修改的代码。这部分对于回答问题至关重要。
-
添加了完整的代码
标签: c# .net ef-code-first entity-framework-core ef-core-2.0