我有禁用延遲加載的數據庫上下文。我正在使用熱切加載來加載所有的實體。我無法更新多對多的關係。使用通用存儲庫更新多對多關係
這是存儲庫。
public class GenericRepository<TEntity> : IGenericRepository<TEntity>
where TEntity : class
{
... other code here...
public virtual void Update(TEntity t)
{
Set.Attach(t);
Context.Entry(t).State = EntityState.Modified;
}
...other code here...
}
這裏是用戶模型。
public partial class User
{
public User()
{
this.Locks = new HashSet<Lock>();
this.BusinessModels = new HashSet<BusinessModel>();
}
public int UserId { get; set; }
public string Username { get; set; }
public string Name { get; set; }
public string Phone { get; set; }
public string JobTitle { get; set; }
public string RecoveryEmail { get; set; }
public Nullable<double> Zoom { get; set; }
public virtual ICollection<Lock> Locks { get; set; }
public virtual ICollection<BusinessModel> BusinessModels { get; set; }
}
如果我修改的商業模式集合,它不保存的商業模式集合雖然我已經連接了整個實體。
Worker.UserRepository.Update(user);
我不確定發生了什麼事。我不想爲了更新多對多關係而破壞我的通用存儲庫/工作模式單元。
編輯2:我有這個工作......但它是非常不同的模式,我要去。硬實現意味着我需要爲每種類型創建一個具有多對多關係的方法。我現在正在調查,看看我是否可以將此作爲一種通用方法。
編輯3:因此,我以前的實現沒有像我認爲的那樣工作。但是現在,我有一個稍微工作的實現。如果有人願意幫助我,我可以從此繼續前行,我會永遠愛你。
public virtual void Update(TEntity updated,
IEnumerable<object> set,
string navigationProperty,
Expression<Func<TEntity, bool>> filter,
Type propertyType)
{
// Find the existing item
var existing = Context.Set<TEntity>().Include(navigationProperty).FirstOrDefault(filter);
// Iterate through every item in the many-to-many relationship
foreach (var o in set)
{
// Attach it if its unattached
if (Context.Entry(o).State == EntityState.Detached)
// Exception "an object with the same key already exists"
// This is due to the include statement up above. That statement
// is necessary in order to edit the entity's navigation
// property.
Context.Set(propertyType).Attach(o);
}
// Set the new value on the navigation property.
Context.Entry(existing).Collection(navigationProperty).CurrentValue = set;
// Set new primitive property values.
Context.Entry(existing).CurrentValues.SetValues(updated);
Context.Entry(existing).State = EntityState.Modified;
}
我再這樣稱呼它:
Worker.UserRepository.Update(user, user.BusinessModels, "BusinessModels", i => i.UserId == user.UserId, typeof (BusinessModel));
非常凌亂,但它讓我更新許多一對多使用泛型的關係。當我去附加已經存在的新值時,我的大問題就是例外。由於包含聲明,它們已經被加載。
這工作:
這不:
它不這樣工作。您需要分別更新BusinessModel。 – Kaf
我有,但它不能保存兩者之間的關係。我需要更新用戶內部的業務模型集合還是調用業務模型庫並將其保存在那裏? – dimiguel
分別更新關係。 – Kaf