2014-07-24 36 views
0

我的實體模型。它的DB第一種方法。實體框架未保存記錄加入表

public partial class Provider 
    { 
     public Provider() 
     { 
      this.ProviderSubCatetogryOnes = new HashSet<ProviderSubCatetogryOne>(); 
     } 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public virtual ICollection<ProviderSubCatetogryOne> ProviderSubCatetogryOnes { get; set; } 
    } 

    public partial class SubCategoryOne 
    { 
     public SubCategoryOne() 
     { 

     } 

     public int Id { get; set; } 
     public string Name { get; set; } 

    } 

    public partial class ProviderSubCatetogryOne 
    { 
     public int Id { get; set; } 
     public int ProviderId { get; set; } 
     public int SubCategoryOneId { get; set; } 

     public virtual Provider Provider { get; set; } 
     public virtual SubCategoryOne SubCategoryOne { get; set; } 
    } 

我有供應商和分類。我必須通過選擇一些類別來更新我的提供商。

我正在嘗試通過以下操作。

var provider = GetProvider(); // Returns a Provider Object. 
provider.SubCategoryOnes.Add(new ProviderSubCategoryOne() 
        { 
         SubCategoryOneId = childCategoryId // existing category id. 
        }); 

但是,當我嘗試保存提供程序時,我的連接表沒有填充任何記錄。

以下是我用於保存的代碼。

public virtual void Update(TDomainModel item) 
      { 
       _logger.Info("In Update."); 
       if (item == null) 
        throw new ArgumentNullException("item"); 
       try 
       { 
        var entity = ToDataEntity(item); 
        DbEntityEntry dbEntityEntry = Context.Entry(entity); 
        try 
        { 
         if (dbEntityEntry.State == EntityState.Detached) 
         { 
          Context.Set<TEntityModel>().Attach(entity); 

          dbEntityEntry.State = EntityState.Modified; 
         } 
        } 
        catch (InvalidOperationException ex) 
        { 
         _logger.Error(ex); 
         _logger.Info("Trying to update by setting the values to CurrentEntity"); 

         if (item as IUniqueId != null) 
         { 
          _logger.Warn("Model is an IUniqueId object. Trying to update by using SetValues."); 
          TEntityModel oldEntity = CurrentDbSet.Find((item as IUniqueId).Id); 
          Context.Entry(oldEntity).CurrentValues.SetValues(entity); 
         } 
        } 
        catch (Exception ex) 
        { 
         _logger.Error(ex); 
        } 

        _savedRecord = entity; 
       } 
       catch (Exception ex) 
       { 
        _logger.Error(ex); 
       } 
      } 

public void Save() 
     { 
      try 
      { 
       _context.SaveChanges(); 
      } 
      catch (DbEntityValidationException ex) 
      { 
       _logger.Error(ex.Message); 
       foreach (DbEntityValidationResult validationResult in ex.EntityValidationErrors) 
       { 
        foreach (DbValidationError validationError in validationResult.ValidationErrors) 
        { 
         _logger.Error(validationError.PropertyName+": "+validationError.ErrorMessage); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       _logger.Error(ex); 
      } 
     } 

有什麼建議嗎?

+0

數據庫或代碼第一?無論哪種情況,請爲您的派生DbContext提供代碼。 –

+0

我上次檢查Code-First時不支持這種情況。您有責任跟蹤更改並自行更新所有導航屬性。我通過混合和自適應[自我跟蹤實體](http://msdn.microsoft.com/en-us/data/jj613924.aspx)到Code-First來創建一個可怕的科學怪人怪獸來解決這個問題。不要在家裏嘗試。 –

+0

您如何保存更改?你是否在'myContext.SaveChanges()'的任何地方有一些東西? – Bruno

回答

0

嘗試添加以下內容:

Provider.SaveChanges(); 

如果我沒記錯的話,節省的更改模型,另外,我使用的數據庫首先的形式給出,所以可能或可能無法正常工作。