实体框架6一对多关系添加和更新结果异常

时间:2015-02-21 19:44:07

标签: c# entity-framework entity-framework-6

我有两个班级:

public class Present : ITripleStarModelBase
{


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

    public virtual ICollection<PresentPhoto> PresentPhotos { get; set; }

    [MaxLength(100)]
    [Index(IsUnique = true)]
    [Required]
    [Changable]
    public string Name { get; set; }

    [MaxLength(500)]
    [Changable]
    public string Description { get; set; }

    [Changable]
    public float Points { get; set; }
    public DateTime CreatedAt { get; set; }

    [Changable]
    public DateTime ModifiedAt { get; set; }

    [Changable]
    public bool IsActive { get; set; }
}

public class PresentPhoto :ITripleStarModelBase
{
    [Key]
    public int Id { get; set; }

    //public int PresentId { get; set; }
    //[ForeignKey("PresentId")]
    //public virtual Present Present { get; set; }

    public int PresentId { get; set; }

    [ForeignKey("PresentId")]
    public virtual Present Present { get; set; }

    [MaxLength(50)]
    [Required]
    public string PhotoName { get; set; }

    public int Size { get; set; }

    public DateTime CreatedAt { get; set; }
    public DateTime ModifiedAt { get; set; }

}

我正在尝试将带有照片的当前对象添加到db,如:

obj = RequestHelper.getRequestBody<Present>();

            using (var dbContextTransaction = db.Database.BeginTransaction())
            {
                try
                {
                    obj.IsActive = true;
                    db.Presents.Add(obj);
                    db.SaveChanges();

                    foreach (var item in obj.PresentPhotos)
                    {
                        if (item.Id == 0)
                        {
                            item.PresentId = obj.Id;
                            db.PresentPhotos.Add(item);
                        }
                    }


                    db.SaveChanges();
                    dbContextTransaction.Commit();
                }
                catch (Exception ex2)
                {
                    dbContextTransaction.Rollback();
                    throw ex2;
                }
            }

这总是以

结果

无法将带有[]的索引应用于System.Collections.Generic.IEnumerable类型的表达式

在db.saveChanges()方法的秒处验证错误。我尝试更新礼物和照片我得到同样的错误。

2 个答案:

答案 0 :(得分:0)

我不承认这个例外,但你最好还是以不同的方式做到这一点。

该行

db.Presents.Add(obj);

...标记obj已添加,但PresentPhoto中的每个obj.PresentPhotos。这就是EF的工作方式。这意味着现在唯一要做的就是从非新照片中删除Added状态:

foreach(var photo in obj.PresentPhotos
                        .Where(p => p.Id > 0)
                        .ToList())
{
    db.Entry(photo).State = EntityState.Detached; // or Unchanged
}

现在SaveChanges会一次性保存新的Present和新照片。您不再需要事务管理。

答案 1 :(得分:0)

错误是里面的最大长度异常。但是信息就是这样。我不知道为什么我们不能在其中访问一个valiadtion异常。并获取validationErrorType,错误类,错误字段等值。

他们正在写一个非常大的项目。但是他们隐藏了所有例外。我无法相信这种业余爱好。