实体框架在批量插入方法上输入重复

时间:2016-11-07 12:43:18

标签: c# entity-framework

我尝试使用此回复https://stackoverflow.com/a/5942176/5741268进行批量插入。但是这个程序正在重复。

我的实体

public class Empresa
{
    public int EmpresaId { get; set; }
    public string CNPJ { get; set; }
    public string CPF { get; set; }
    public string IE { get; set; }
    public string xNome { get; set; }
    public string cMun { get; set; }
    public string CNAE { get; set; }

    //Endereço
    public string COD_PAIS { get; set; }
    public string UF { get; set; }
    public string CEP { get; set; }
    public string END { get; set; }
    public string NUM { get; set; }
    public string COMPL { get; set; }
    public string BAIRRO { get; set; }
    public string FONE { get; set; }
}

public class NFe
{
    public int NFeId { get; set; }
    //public int NFePartId { get; set; }

    public string versao { get; set; }
    public string chave { get; set; }
    public string ide_mod { get; set; }
    public string ide_serie { get; set; }
    public string ide_nNF { get; set; }
    public DateTime? ide_dEmi { get; set; }
    public DateTime? ide_dSaiEnt { get; set; }
    public string ide_tpNF { get; set; }
    public decimal? TOTAIS_vBC { get; set; }
    public decimal? TOTAIS_vICMS { get; set; }
    public decimal? TOTAIS_vBCST { get; set; }
    public decimal? TOTAIS_vST { get; set; }
    public decimal? TOTAIS_vProd { get; set; }
    public decimal? TOTAIS_vFrete { get; set; }
    public decimal? TOTAIS_vSeg { get; set; }
    public decimal? TOTAIS_vDesc { get; set; }
    public decimal? TOTAIS_vII { get; set; }
    public decimal? TOTAIS_vIPI { get; set; }
    public decimal? TOTAIS_vPIS { get; set; }
    public decimal? TOTAIS_vCOFINS { get; set; }
    public decimal? TOTAIS_vOutro { get; set; }
    public decimal? TOTAIS_vNF { get; set; }
    public string infCpl { get; set; }
    public bool cancelada { get; set; } = false;

    public virtual NFePart NFePart { get; set; }
    public virtual Empresa Empresa { get; set; }
    public virtual ICollection<NFeItem> NFeItemLista { get; set; }
}

public class NFePart
{
    public int NFePartId { get; set; }
    public string NOME { get; set; }
    public string COD_PAIS { get; set; }
    public string CNPJ { get; set; }
    public string IE { get; set; }
    public string UF { get; set; }
    public string CEP { get; set; }
    public string END { get; set; }
    public string NUM { get; set; }
    public string COMPL { get; set; }
    public string BAIRRO { get; set; }
    public string COD_MUN { get; set; }
    public string FONE { get; set; }

    public virtual Empresa Empresa { get; set; }

    public virtual ICollection<NFe> NFe { get; set; }

    //Uso interno, não mapeado no banco de dados
    [NotMapped]
    public int COD_PART { get; set; }
}

这是我的代码:

List<NFe> notas = new List<NFe>();

//populate notas
DataContext context = null;

try
{
    List<Empresa> nEmpresas = notas.DistinctBy(x => new { x.Empresa.CNPJ }).Select(x => x.Empresa).ToList();

    foreach (Empresa empresaToAdd in nEmpresas)
    {
        context = new DataContext();
        context.Configuration.AutoDetectChangesEnabled = false;

        int count = 0;
        List<NFe> notasFilter;

        notasFilter = notas.Where(x => x.Empresa.CNPJ == empresaToAdd.CNPJ).ToList();

        int commitCount = 2000;

        foreach (var notaInsert in notasFilter)
        {
            ++count;
            context = AddToContext(context, notaInsert, count, commitCount, true, notasFilter.Count);
        }
    }
}
finally
{
    if (context != null)
        context.Dispose();
}

我的AddtoContext功能

private static DataContext AddToContext(DataContext context, NFe entity, int count, int commitCount, bool recreateContext, int totalNfe)
{
    //if has already inserted -> Attach entity.Empresa 
    if ((count > commitCount && commitCount != 0) || entity.Empresa.EmpresaId != 0)
    {
        context.Empresa.Attach(entity.Empresa);
    }

    if (context.NFePart.Any(p => p.CNPJ == entity.NFePart.CNPJ && p.Empresa.CNPJ == entity.Empresa.CNPJ))
    {
        context.NFePart.Attach(entity.NFePart);
    }

    context.Set<NFe>().Add(entity);

    if (commitCount == 0 || count % commitCount == 0 || count == totalNfe)
    {
        context.SaveChanges();

        if (recreateContext)
        {
            context.Dispose();
            context = new DataContext();
            context.Configuration.AutoDetectChangesEnabled = false;
        }
    }

    return context;
}

保存更改后,EF插入重复

enter image description here

在代码中我经历了所有的&#34; notas&#34;并且仅过滤&#34; empresaToAdd&#34;有问题。但是当循环移动到下一个&#34; empresaToAdd&#34;它再次插入注释循环中的前一个公司,甚至使用Dispose,并重新创建上下文

enter image description here

NFeItemMap

public class NFeItemMap : EntityTypeConfiguration<NFeItem>
{
    public NFeItemMap()
    {
        ToTable("NFeItem");
        HasKey(x => x.NFeItemId);
        Property(x => x.infAdProd).HasColumnType("text").IsMaxLength();


        //one-to-many 
        HasRequired(s => s.NFe) 
            .WithMany(s => s.NFeItemLista); 



        HasRequired(x => x.Empresa)
            .WithMany();             

    }
}

0 个答案:

没有答案