C# 实体框架-重复条目';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

使用MySql数据库和实体框架,当我尝试插入包含子数据列表的数据时,我收到了以下错误:InnerException={“键“PRIMARY”的重复条目“1”}


以下是我的桌子的图像:


这是我的模型:
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
。有点离题:如果您的类、属性和方法是用英语编写的,那会更好。另一方面,也有很多这样的产品。布埃娜·苏尔特!我编辑了一下,再解释一下