【发布时间】:2011-11-18 04:24:13
【问题描述】:
我正在使用 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; }
}
提前谢谢你
【问题讨论】:
-
你的意思是,如果你改变模型并生成数据库,一切都会被破坏?怎么了?
标签: c# asp.net-mvc generics entity-framework-4 repository-pattern