在Microsoft.EntityFrameworkCore.SqlServer 5.0.8 c#中添加复合键



我有一个复合键(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


那么你要考虑你的系统受到了多大的打击。这可能是高命中率系统中的竞争条件。

最新更新