我的问题是以下问题。
我收到包含以下消息的 EF 异常:
操作失败:无法更改关系,因为 一个或多个外键属性不可为空。当一个 对关系进行更改,相关的外键属性为 设置为空值。如果外键不支持空值, 必须定义新关系,外键属性必须 分配了另一个非 null 值,或者不相关的对象必须是 删除。
对于此异常,我可以自己确定 EF 正在尝试将 null 值设置为不可为空类型的 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 关联 all 的 caracteristic 组运行良好,但我该组包含一个 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;
}
为什么它不起作用。
您不需要自己添加 [ForeignKey] 属性。尝试将你的Caracteristic模型更改为:
public class Caracteristic
{
#region Properties
public int Id { get; set; }
[Required]
[MaxLength(50)]
public string Name { get; set; }
public string Description { get; set; }
public int CaracteristicGroupId { get; set; }
public virtual CaracteristicGroup Group { get; set; }
#endregion
}