实体框架:无法在帖子上添加多个实体

时间:2017-05-09 15:00:46

标签: c# entity-framework api

尝试插入嵌入另一个实体的实体,我收到了这个错误:

  

无法跟踪实体类型“Tache”的实例,因为已经跟踪了具有相同键的此类型的另一个实例。添加新实体时,对于大多数密钥类型,如果未设置密钥,则将创建唯一的临时密钥值(即,如果为密钥属性指定了其类型的默认值)。如果要为新实体显式设置键值,请确保它们不会与现有实体或为其他新实体生成的临时值发生冲突。附加现有实体时,请确保只有一个具有给定键值的实体实例附加到上下文。'

C#型号:

public class Mission
{
    [Key]
    public int Id { get; set; }

    public string Titre { get; set; }
    public DateTime DateDebut { get; set; }
    public DateTime DateFin { get; set; }
    public string Context { get; set; }

    public ICollection<Tache> Taches { get; set; }

    public string Client { get; set; }

    //public ICollection<MissionComp> Competences{ get; set; }
}

发布功能:

public Mission Post([FromBody]Mission mission)
{
        try
        {
            context.Tache.AddRange(mission.Taches);
            //context.SaveChanges();
            context.Add(mission);
            context.SaveChanges();

            return mission;
        }
        catch (System.Exception ex)
        {
            logger.LogError(ex.Message, ex);
            throw;
        }
}

已经在堆栈溢出和git上搜索了一些答案,但没有人帮助我。 如果有人有想法我真的会感兴趣:D

谢谢!

编辑:

这里有一些有趣的东西,我发送了一个'Tache'数组,但两者的Id是相同的,所以我认为它们会发生碰撞:https://puu.sh/vLqTE/52fb2059bc.png

也许有人知道如何设置不碰撞的临时密钥?

1 个答案:

答案 0 :(得分:0)

好的,所以我自己发现,由于一个不可知的原因,我列表中的所有对象都有相同的ID ......出于一个愚蠢的原因:

public addSousMission() {
        let tache: Tache = {
             Id: 1,
             TacheString: this.champTache
        }

        tache.TacheString = this.champTache;

        this.mission.Taches.push(tache);
        this.champTache = '';
    }

修改为解决我的所有问题:

public addSousMission() {
        let tache: Tache = new Tache();

        tache.TacheString = this.champTache;

        this.mission.Taches.push(tache);
        this.champTache = '';
    }

感谢您的帮助:D