0

我使用帶有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; } 
} 

預先感謝您

+0

你是什麼意思,如果你改變模型並生成數據庫,一切都會被打破?出了什麼問題? –

回答

1

當你映射在EF您需要啓用「級聯刪除」,這樣,當父被刪除所有兒童實體被刪除。

HasRequired(child => child.Parent) 
    .WithMany(parent => parent.Children) 
    .HasForeignKey(child => child.ParentId) 
    .WillCascadeOnDelete(); 

如果您建模現有數據庫,請確保使用「級聯刪除」設置了外鍵。

+0

是否有可能,如果我們只是修改存儲庫模式代碼?不建模? – Rivera

+0

@Rivera在刪除父項之前,您必須刪除每個子項實體。這將是一個可怕的解決方案:) – Eranga

+0

爲什麼它會很糟糕?並且我發佈了我的模型,所以如果您不介意,請根據我的模型更改答案:) – Rivera