0
我的問題如下。EF使用通過外鍵鏈接的集合保存實體時出錯
我收到一個EF例外此消息:
操作失敗:關係不能被改變,因爲 一個或多個外鍵的屬性是不可爲空。當 更改爲關係時,相關的外鍵屬性 設置爲空值。如果外鍵不支持空值,則必須定義一個新的關係,外鍵屬性必須爲 分配另一個非空值,或者無關對象必須爲 刪除。
對於這個例外,我可以自己弄清楚,EF正試圖設置一個空值到一個不可空類型的int字段。
這裏是我的背景:
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class RealEstDBContext : DbContext
{
#region Constructors
public RealEstDBContext()
: base("RealEstDBContext")
{
}
#endregion
#region DBSets
public DbSet<Caracteristic> Caracteristics { get; set; }
public DbSet<CaracteristicGroup> CaracteristicGroups { get; set; }
public DbSet<Parameter> Parameters { get; set; }
public DbSet<Property> Properties { get; set; }
public DbSet<PropertyType> ProertyTypes { get; set; }
public DbSet<Caption> Captions { get; set; }
#endregion
}
然後我的模型:
public class CaracteristicGroup
{
public CaracteristicGroup()
{
Caracteristics = new List<Caracteristic>();
}
#region Properties
public int Id { get; set; }
[Required]
[MaxLength(50)]
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<Caracteristic> Caracteristics {get; set; }
#endregion
}
public class Caracteristic
{
#region Properties
public int Id { get; set; }
[Required]
[MaxLength(50)]
public string Name { get; set; }
public string Description { get; set; }
[Required]
[ForeignKey("Group")]
public int GroupId { get; set; }
[ForeignKey("GroupId")]
public virtual CaracteristicGroup Group { get; set; }
#endregion
}
,如果我試圖保存不含任何caracteristic asociated everithing運行好caracteristic組,但我認爲組包含一個特徵EF去拋出異常。
下面是保存組的代碼。
[HttpPost]
public JsonResult SaveGroup(CaracteristicGroup caracteristicGroup)
{
JsonResult toReturn = new JsonResult();
toReturn.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
try
{
if (ModelState.IsValid)
{
var oldCaracteristicGroup = UnitOfWork.Instance.DataContext.CaracteristicGroups.Include(c => c.Caracteristics).Where(p => p.Id == caracteristicGroup.Id).FirstOrDefault();
if (oldCaracteristicGroup == null)
UnitOfWork.Instance.DataContext.CaracteristicGroups.Add(caracteristicGroup);
else
{
oldCaracteristicGroup.Name = caracteristicGroup.Name;
oldCaracteristicGroup.Description = caracteristicGroup.Description;
UnitOfWork.Instance.DataContext.Entry(oldCaracteristicGroup).State = EntityState.Modified;
foreach (Caracteristic item in oldCaracteristicGroup.Caracteristics)
UnitOfWork.Instance.DataContext.Entry(item).State = EntityState.Modified;
}
UnitOfWork.Instance.SubmmitWriteChanges();
toReturn.Data = new
{
Success = true,
Message = "Caracteristic group Saved",
Content = oldCaracteristicGroup != null ? oldCaracteristicGroup.Id : caracteristicGroup.Id
};
}
else
{
string errorMsg = string.Empty;
foreach (var state in ModelState)
foreach (var error in state.Value.Errors)
errorMsg += error.ErrorMessage + Environment.NewLine;
toReturn.Data = new
{
Success = false,
Message = errorMsg,
Content = ""
};
}
}
catch(Exception ex)
{
toReturn.Data = new
{
Success = false,
Message = "An critical erros has ocur in the server. Call your administrator",
Content = ""
};
}
return toReturn;
}
爲什麼它不起作用。
這不能解決問題 –