我有一个复合键(sku
(nvarchar
/字符串值)和quantity
(int
值)),我想在Microsoft.EntityFrameworkCore.SqlServer 5.0.8使用c#做一个更新。
AddOrUpdate
调用在上下文中丢失了——并不是说我们应该使用它,因为它主要用于迁移。
我如何做到这一点?
使用复合键意味着(与单个代理键-主键相比)......这仍然是一个"匹配,找到或不找到"的问题。命题。
首先,设置。
https://learn.microsoft.com/en-us/ef/core/modeling/keys?tabs=data-annotations configuring-a-primary-key
您也可以配置多个属性作为实体的键
- 这被称为组合键。复合键只能使用Fluent API配置;惯例永远不会建立一个
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Car>()
.HasKey(c => new { c.State, c.LicensePlate });
}
然后将项添加到dbContext中。(如向集合中添加对象)
for each CarEntity currentCar : myCarCollection)
{
/* this code may not work for the future copy-pasters out there..i'm building up a little, see "WHERE IN" later in this answer */
this.myEntityDbContext.MyCars.Add(currentCar);
}
那么你将调用
await this.myEntityDbContext.SaveChangesAsync(token);
(或同步版本.SaveChanges)
EF ~~可能能够(但可能不能)找到存在的匹配项(并更新存在的)或插入新的匹配项。它取决于myDbContext在影响时刻的状态。(再一次,我试图通过谈论它来建立这一点,而不仅仅是给出一个复制/粘贴的答案……你得试着理解英孚是如何运作的……以便更好地调试它)
与M$的例子。
如果数据库中已经有
c。State = "VA", c.LicensePlate = "2222-2222">
但没有
c。State = "WV", c.LicensePlate = "3333-3333">
现在,将这两个添加到myDbContext ("currentCar")代码),然后调用"SaveChangesAsync"....那可能有用。但它很可能会失败。没关系。
这里有一个"诀窍"。(它可能不是唯一的)
您需要将现有的项(VA/2222-2222已经存在)获取到myDbContext中。
在输入mycars。add....
之前调用(rdbms WHERE IN)的EF等价(参见实体框架核心- IN子句等价)
和您尝试的值对照EF版本的"WHERE IN".....进行检查将是"汽车"的两个组合。
我刚看了其中一条评论。是的,这很有帮助。为清晰起见,下面的链接:如果行存在,则更新行;否则,使用实体框架插入逻辑
该链接正在说"如何检查DBCONTEXT中存在/不存在"。而是一本书。上面的where-exists是关于为几个(汽车,书籍,等等)加载dbcontext的。
现在,你可以做一些检查是否添加(一个汽车)到myDbContext,或者"改变一些属性"。存在的。* * *
但是正如另一个链接指出的,你要检查值(VA和NC 2222-2222和3333-3333),你要检查dbContext (items)
让我解释一下这个答案的"诀窍"。
context.Entry(blog).State = blog.BlogId == 0 ?
EntityState.Added :
EntityState.Modified;
这是一个古老的-"相当标准"&;使用0作为"我是否已经存在"的技巧。与"汽车"一起;从上面看,你没有一个单一的代理-通常是主键,比如"blogid"。汽车有两个部分。因此,您必须使用n-parts-of- compound-key检查myDbContext来确定这一点。这需要一些实验来调整你的代码。
你必须知道你的上下文是长期存在的(如winforms桌面应用程序)还是短暂存在的(如rest-api)。
但这是一个更深层次的问题。这是一个提示。
https://learn.microsoft.com/en-us/ef/core/querying/tracking
那么你要考虑你的系统受到了多大的打击。这可能是高命中率系统中的竞争条件。