2014-03-07 255 views
0

我在使用EF6和MySql更新實體時遇到問題。實體框架和MySql更新實體

這是部分代碼:

public partial class Repositorio<T> : IRepositorio<T> where T : EntidadBase 
{ 
    private readonly IDbContext _contexto; 
    private IDbSet<T> _entidades; 

    public Repositorio(IDbContext contexto) 
    { 
     this._contexto = contexto; 
    } 

    private IDbSet<T> Entidades 
    { 
     get 
     { 
      if (_entidades == null) 
       _entidades = _contexto.Set<T>(); 
      return _entidades; 
     } 
    } 

    public void Insert(T entity) 
    { 
     try 
     { 
      if (entity == null) 
       throw new ArgumentNullException("entity"); 

      this.Entidades.Add(entity); 

      this._contexto.SaveChanges(); 
     } 
     catch (Exception dbEx) 
     { 
      throw dbEx 
     } 
    } 


    public void Update(T entidad) 
    { 
     try 
     { 
      if (entidad == null) 
       throw new ArgumentNullException("entidad"); 

      this._contexto.SaveChanges(); 
     } 
     catch (Exception dbEx) 
     { 
      throw dbEx; 
     } 
    } 
} 

和我一起類似的東西,用它:

var _repositorio = new Repositorio<MyEntity>(myContext); 
var myEntity = _repositorio.GetById(13); 

myEntity.Name = "Mooo"; 

_repositorio.Update(myEntity); 

它不拋出任何異常,但數據沒有變化。

Insert()方法完美。

對此有何想法? PS:我使用NuGet Package Installer的MySql.Data.Entities,它包括EF 6.0.0,MySql.Data 6.8.3.0和MySql.Data.Entity.EF6 6.8.3.0。

+0

您的示例代碼顯示了插入方法,但對回購的調用調用了更新方法。你正在調用的更新方法的代碼是什麼? –

+0

你好尼爾。您必須在存儲庫的代碼塊中向下滾動以查看它:-) – dank0ne

+0

請考慮刪除此存儲庫層。它只會麻煩你。首先,你只能更新單個數據實例。如果你想在一次交易中保存很多對象呢?請參閱[此問題](http://stackoverflow.com/q/21758807/861716)以獲得有關該主題的深入討論。和[這一個](http://stackoverflow.com/questions/5625746/generic-repository-with-ef-4-1-what-is-the-point/5626884#5626884)可能會說服你使用'DbSet '和'DbContext'直接。 –

回答

0

哈哈,啊好,我看到您的問題..改變你的更新方法,以這樣的:

public void Update(T entidad) 
    { 
     try 
     { 
      if (entidad == null) 
       throw new ArgumentNullException("entidad"); 

      _contexto.Entry(entidad).State = System.Data.EntityState.Modified; 
      this._contexto.SaveChanges(); 
     } 
     catch (Exception dbEx) 
     { 
      throw dbEx; 
     } 
    } 

而且,看看使用的UnitOfWork模式與存儲庫模式一起,你會需要它。

+0

但是此時實體已經應該是'Modified'(假設'GetById'將它附加到存儲庫的上下文中)。 –