我正在使用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; }
}
提前谢谢
答案 0 :(得分:1)
在EF中映射实体时,需要启用“级联删除”,以便在删除父项时删除所有子项。
HasRequired(child => child.Parent)
.WithMany(parent => parent.Children)
.HasForeignKey(child => child.ParentId)
.WillCascadeOnDelete();
如果要对现有数据库建模,请确保使用“级联删除”设置外键。