2016-02-25 14 views
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; 
     } 

爲什麼它不起作用。

回答

0

您不應該自己添加[ForeignKey]屬性。嘗試將您的特性模型更改爲:

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 
} 
+0

這不能解決問題 –

相關問題