使用存储库模式和DbContext删除EF 4中的关系密钥

时间:2011-11-18 04:24:13

标签: c# asp.net-mvc generics entity-framework-4 repository-pattern

我正在使用ASP.NET MVC,Sql Compact Edition,Entity Framework 4以及带有DbContext的通用存储库模式。 当我想要删除一个具有子或删除实体且具有多对多关系的实体时,我遇到了一些问题。

我收到了错误: 操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

有一些帖子解释了它,但是我被卡住了,因为这个例子很多没有使用存储库模式或者使用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; }
}

提前谢谢

1 个答案:

答案 0 :(得分:1)

在EF中映射实体时,需要启用“级联删除”,以便在删除父项时删除所有子项。

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

如果要对现有数据库建模,请确保使用“级联删除”设置外键。