C# 实体框架-重复条目';1';对于键';初级'&引用;
使用MySql数据库和实体框架,当我尝试插入包含子数据列表的数据时,我收到了以下错误:InnerException={“键“PRIMARY”的重复条目“1”}C# 实体框架-重复条目';1';对于键';初级'&引用;,c#,mysql,entity-framework,foreign-keys,C#,Mysql,Entity Framework,Foreign Keys,使用MySql数据库和实体框架,当我尝试插入包含子数据列表的数据时,我收到了以下错误:InnerException={“键“PRIMARY”的重复条目“1”} 以下是我的桌子的图像: 这是我的模型: public class Etapa { public int Id { get; set; } public string Descricao { get; set; } [Column("ativo", TypeName = "bi
以下是我的桌子的图像:
这是我的模型:
public class Etapa
{
public int Id { get; set; }
public string Descricao { get; set; }
[Column("ativo", TypeName = "bit")]
public bool Ativo { get; set; }
[Column("finalizadora", TypeName = "bit")]
public bool Finalizadora { get; set; }
public List<EtapaVinculada> ListaEtapaVinculada { get; set; }
}
Etapa的上下文如下:
public class ContextoEtapa : Contexto
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Etapa>().HasMany(x => x.ListaEtapaVinculada).WithOne(y => y.EtapaPai).HasForeignKey(x => x.EtapaPaiId);
}
public async Task Adicionar(Etapa registro)
{
await AddAsync(registro);
await SaveChangesAsync();
}
}
公共类ContextoEtapa:Contexto
{
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity();
}
公共异步任务Adicionar(Etapa注册表)
{
等待AddAsync(registro);
等待SaveChangesSync();
}
}
手动填充数据库中的表,当我调试上下文时,我可以看到我的Etapa对象已填充,并且属性listedapavinculada也已正确填充
当使用Add方法将填充了EtapaVinculada列表的Etapa对象插入数据库时,就会出现问题。在我看来,我做了一些错误的映射,因为它给人的印象是Entity试图在一行中插入2x Etapa记录,陷入了重复键错误
自动增量正在工作。如果我尝试保存这样的对象:
{
Etapa etapa = new Etapa();
etapa.Descricao = "test";
etapa.Ativo = true;
etapa.Finalizadora = true;
etapa.ListaEtapaVinculada = new List<EtapaVinculada>(); // Without itens
using (var context = new ContextoEtapa())
{
await context.Etapa.AddAsync(etapa);
await context.SaveChangesAsync();
}
}
{
Etapa etapaFilha = null;
using (var context = new ContextEtapa())
{
etapaFilha = await context.Etapa.Where(x => x.Id == 666).First();
}
Etapa etapa = new Etapa();
etapa.Descricao = "test";
etapa.Ativo = true;
etapa.Finalizadora = true;
etapa.ListaEtapaVinculada = new List<EtapaVinculada>();
EtapaVinculada etapaVinculada = new EtapaVinculada();
etapaVinculada.EtapaPaiId = etapa.Id;
etapaVinculada.EtapaPai = etapa;
etapaVinculada.EtapaFilhaId = etapaFilha.Id;
etapaVinculada.EtapaFilha = etapaFilha;
etapa.listaEtapaVinculada.Add(etapaVinculada);
using (var context = new ContextoEtapa())
{
await context.Etapa.AddAsync(etapa);
await context.SaveChangesAsync();
}
}
{
Etapa Etapa=新的Etapa();
etapa.descripcao=“测试”;
etapa.Ativo=真;
etapa.a=真;
etapa.ListaEtapaVinculada=new List();//不带itens
使用(var context=new ContextoEtapa())
{
wait context.Etapa.AddAsync(Etapa);
wait context.saveChangesSync();
}
}
但是,如果我这样做:
{
Etapa etapa = new Etapa();
etapa.Descricao = "test";
etapa.Ativo = true;
etapa.Finalizadora = true;
etapa.ListaEtapaVinculada = new List<EtapaVinculada>(); // Without itens
using (var context = new ContextoEtapa())
{
await context.Etapa.AddAsync(etapa);
await context.SaveChangesAsync();
}
}
{
Etapa etapaFilha = null;
using (var context = new ContextEtapa())
{
etapaFilha = await context.Etapa.Where(x => x.Id == 666).First();
}
Etapa etapa = new Etapa();
etapa.Descricao = "test";
etapa.Ativo = true;
etapa.Finalizadora = true;
etapa.ListaEtapaVinculada = new List<EtapaVinculada>();
EtapaVinculada etapaVinculada = new EtapaVinculada();
etapaVinculada.EtapaPaiId = etapa.Id;
etapaVinculada.EtapaPai = etapa;
etapaVinculada.EtapaFilhaId = etapaFilha.Id;
etapaVinculada.EtapaFilha = etapaFilha;
etapa.listaEtapaVinculada.Add(etapaVinculada);
using (var context = new ContextoEtapa())
{
await context.Etapa.AddAsync(etapa);
await context.SaveChangesAsync();
}
}
{
Etapa-etapaFilha=null;
使用(var context=new ContextEtapa())
{
etapaFilha=wait context.Etapa.Where(x=>x.Id==666.First();
}
Etapa Etapa=新的Etapa();
etapa.descripcao=“测试”;
etapa.Ativo=真;
etapa.a=真;
etapa.ListaEtapaVinculada=新列表();
EtapaVinculada EtapaVinculada=新EtapaVinculada();
etapavinglada.EtapaPaiId=etapa.Id;
etapavinglada.EtapaPai=etapa;
etapavinglada.EtapaFilhaId=etapaFilha.Id;
etapaVinculada.EtapaFilha=EtapaFilha;
etapa.listaEtapaVinculada.Add(etapaVinculada);
使用(var context=new ContextoEtapa())
{
wait context.Etapa.AddAsync(Etapa);
wait context.saveChangesSync();
}
}
现在我得到了重复钥匙的错误。在我看来,EF试图插入2x Etapa对象,正确的是insert Etapa,然后插入ListaEtapaVinculada的所有ITEN。我认为问题在于,当试图同时分配对象实例和id时,请尝试对以下代码行进行注释:
{
Etapa etapaFilha = null;
using (var context = new ContextEtapa())
{
etapaFilha = await context.Etapa.Where(x => x.Id == 666).First();
}
Etapa etapa = new Etapa();
etapa.Descricao = "test";
etapa.Ativo = true;
etapa.Finalizadora = true;
etapa.ListaEtapaVinculada = new List<EtapaVinculada>();
EtapaVinculada etapaVinculada = new EtapaVinculada();
// etapaVinculada.EtapaPaiId = etapa.Id; // this is asigned when asign to collection and savechanges
// etapaVinculada.EtapaPai = etapa;
etapaVinculada.EtapaFilhaId = etapaFilha.Id; //
// etapaVinculada.EtapaFilha = etapaFilha; this is duplicate
etapa.listaEtapaVinculada.Add(etapaVinculada);
using (var context = new ContextoEtapa())
{
await context.Etapa.AddAsync(etapa);
await context.SaveChangesAsync();
}
}
{
Etapa-etapaFilha=null;
使用(var context=new ContextEtapa())
{
etapaFilha=wait context.Etapa.Where(x=>x.Id==666.First();
}
Etapa Etapa=新的Etapa();
etapa.descripcao=“测试”;
etapa.Ativo=真;
etapa.a=真;
etapa.ListaEtapaVinculada=新列表();
EtapaVinculada EtapaVinculada=新EtapaVinculada();
//etapavinglada.EtapaPaiId=etapa.Id;//当asign to collection和savechanges时,这是asigned
//etapavinglada.EtapaPai=etapa;
etapavinglada.EtapaFilhaId=etapaFilha.Id;//
//etapavinglada.EtapaFilha=EtapaFilha;这是重复的
etapa.listaEtapaVinculada.Add(etapaVinculada);
使用(var context=new ContextoEtapa())
{
wait context.Etapa.AddAsync(Etapa);
wait context.saveChangesSync();
}
}
感谢您的翻译;我投票赞成现在重新打开,你必须将“自动增量”部分添加到你的逻辑中。这取决于EF版本和使用的db提供程序。此外,EF和EF core的行为也不同。下面是一些EF核心、fluent api、sql的例子,让您了解一下。请注意,示例是针对SQL
而不是mySql
。有点离题:如果您的类、属性和方法是用英语编写的,那会更好。另一方面,也有很多这样的产品。布埃娜·苏尔特!我编辑了一下,再解释一下