You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Entity Framework Core创建含多电话的Client时出现MERGE语法错误

解决EF Core创建多电话Client时的DbUpdateException(MERGE语法错误)

我来帮你排查这个头疼的问题!出现Incorrect syntax near 'MERGE'这个错误,结合你的代码来看,主要是实体关系配置缺失、数据类型不匹配、代码拼写错误,还有可能是SQL Server版本兼容的问题,咱们逐个解决:

1. 补全实体间的关联关系

你的Phone类完全没和Client挂钩啊!EF Core根本不知道这俩是一对多的关系,自然会生成错误的SQL语句。赶紧给Phone加个外键和导航属性:

public class Phone 
{ 
    [Key] 
    public int IdPhone { get; set; } 
    // 新增:关联Client的外键
    public int ClientId { get; set; }
    // 导航属性,让EF知道这个Phone属于哪个Client
    public Client Client { get; set; }
    // 重点:把Number改成string!你传入的是字符串,而且电话号码用int很容易出问题(比如开头0、国际区号)
    public string Number{ get; set; } 
}

另外,在Client类里可以加个注解明确关联关系(可选,但更清晰):

public class Client 
{ 
    public int Id { get; set; } 
    public string Name{ get; set; } 
    public string Lastname{ get; set; } 
    public int DNI { get; set; } 
    [InverseProperty(nameof(Phone.Client))]
    public List<Phone> Phones{ get; set; } 
}

2. 修正代码里的拼写错误

你的Create方法里有两处明显的笔误,这也会导致逻辑出错:

  • 把参数client写成了cliente(比如x.DNI == cliente.DNI这里)
  • _context.Cliente.Add(client)应该是_context.Client.Add(client)(DbSet名称要和实体类对应)

而且!不需要手动调用_context.Phones.AddRange(client.Phones),只要关系配置正确,EF Core会自动跟踪导航属性的变化,添加Client的时候会顺带把关联的Phones一起插入数据库。修正后的Create方法:

public Client Create(Client client) 
{ 
    if (_context.Client.Any(x => x.DNI == client.DNI)) 
        throw new AppException("Username " + client.DNI + " is already taken"); 
    _context.Client.Add(client); 
    _context.SaveChanges(); 
    return client; 
}

3. 确保数据类型匹配

你定义的Phone.Number是int,但传入的JSON里是字符串"4444444",这会导致映射错误,而且电话号码真的不适合用int类型(比如号码开头有0的话会被截断,或者带+号的国际号码根本存不了),所以一定要改成string,和你传入的数据保持一致。

4. 检查SQL Server版本兼容性

如果你的数据库是SQL Server 2008或者更早的版本,EF Core默认用的MERGE语句是不被支持的(SQL Server 2008及以前不支持MERGE语法)。这时候需要给EF Core配置成兼容旧版本的模式:
在你的DbContext的OnConfiguring方法里加这段配置:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlServer("你的数据库连接字符串", 
        options => options.UseSqlServerLegacyRowNumberPaging());
}

要是用的是EF Core 3.x及以上版本,也可以直接禁用批量操作来绕开MERGE:

optionsBuilder.UseSqlServer("你的数据库连接字符串",
    options => options.MaxBatchSize(1));

按照上面的步骤改完,应该就能顺利创建带多个电话的Client了!

内容的提问来源于stack exchange,提问作者PCH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:30:46