我使用帶有DbContext的通用存儲庫模式的ASP.NET MVC,Sql Compact Edition,Entity Framework 4。 當我想要刪除一個具有子對象或刪除多對多關係實體的實體時,我遇到了一些問題。使用存儲庫模式和DbContext刪除EF 4中的關係密鑰
我得到錯誤: 操作失敗:無法更改關係,因爲一個或多個外鍵屬性是不可空的。當對關係進行更改時,相關的外鍵屬性將設置爲空值。如果外鍵不支持空值,則必須定義新的關係,必須爲外鍵屬性指定另一個非空值,或者必須刪除不相關的對象。
有很多帖子解釋它,但我堅持因爲這個例子很多沒有存儲庫模式或使用ObjectContext解釋。
這裏是一些我的代碼庫基地和我使用它的方式。
public abstract class RepositoryBase<T> : IRepository<T> where T : class
{
private readonly DbContext _context;
private readonly IDbSet<T> _dbset;
protected RepositoryBase(DbContext dbContext)
{
_context = dbContext;
_dbset = _context.Set<T>();
}
public void Delete(T entity)
{
_dbset.Remove(entity);
Commit();
}
private void Commit()
{
try
{
_context.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
var exceptionMessage = new StringBuilder();
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
exceptionMessage.AppendFormat("Property: {0} Error: {1}", validationError.PropertyName,
validationError.ErrorMessage);
}
}
throw; //so that we see the exception right away when we develop
}
}
和服務調用它:
public class UserService : IUserService
{
private readonly IUserRepository _userRepository;
public UserService(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public void DeleteUser(User user)
{
_userRepository.Delete(user);
}
public void DeleteUser(int userId)
{
var user = _userRepository.GetById(userId);
DeleteUser(user);
}
}
我的意思是,我們可以只調用從資源庫中刪除服務,所有子對象被自動刪除或者如果我要刪除子實體一個?一個,我怎麼能做到這一點? 我不想用級聯修改數據庫,因爲當我更改模型並從模型生成數據庫時,它會打破所有。
更新:這裏是模型
public partial class User
{
public User()
{
this.EAConnections = new HashSet<EAConnection>();
this.UserRepositoryRoles = new HashSet<UserLinkRepositoryRole>();
}
public int UserId { get; set; }
public string UserName { get; set; }
public virtual ICollection<EAConnection> EAConnections { get; set; }
public virtual ICollection<UserLinkRepositoryRole> UserRepositoryRoles { get; set; }
}
public partial class UserLinkRepositoryRole
{
public int UserRepositoryRoleId { get; set; }
public int UserId { get; set; }
public int RepositoryRoleId { get; set; }
public int EAConnectionId { get; set; }
public virtual User User { get; set; }
public virtual RepositoryRole RepositoryRole { get; set; }
public virtual EAConnection EAConnection { get; set; }
}
預先感謝您
你是什麼意思,如果你改變模型並生成數據庫,一切都會被打破?出了什麼問題? –