我有两个班级:
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()方法的秒处验证错误。我尝试更新礼物和照片我得到同样的错误。答案 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,错误类,错误字段等值。
他们正在写一个非常大的项目。但是他们隐藏了所有例外。我无法相信这种业余爱好。