Я использую ASP.NET MVC, Sql Compact Edition, Entity Framework 4 с общим шаблоном хранилища с помощью DbContext.
У меня возникает проблема, когда я хочу удалить одну сущность, у которой есть дочерний объект, или удалить сущность с отношением «многие ко многим».
Я получил ошибку:
Операция не выполнена: отношение не может быть изменено, так как одно или несколько свойств внешнего ключа не могут иметь значение NULL. Когда в отношение вносится изменение, для соответствующего свойства внешнего ключа устанавливается нулевое значение. Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, свойству внешнего ключа должно быть назначено другое ненулевое значение или несвязанный объект должен быть удален.
Это объясняется в нескольких публикациях, но я застрял, потому что пример объясняется без шаблона хранилища или с использованием 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; }
}
Заранее спасибо