EF 6.1.1的孤儿对象问题
本文关键字:对象 问题 EF | 更新日期: 2023-09-27 18:11:34
我有一个域对象,结构如下
public class Country : Entity
{
public Country()
{
States=new List<State>();
}
public string CountryName { get; set; }
public string CountyCode { get; set; }
public virtual ICollection<State> States { get; private set; }
public State GetStateById(int stateId)
{
return States.FirstOrDefault(x => x.Id == stateId);
}
public void DeleteState(int stateId)
{
var state = GetStateById(stateId);
if(state==null) return;
States.Remove(state);
}
}
这里我正在使用DeleteState方法删除一个状态对象(这是一个国家的子对象)。
和我有存储库(它是一个聚合根)与以下结构
public class CountryRepository : Repository<Country>, ICountryRepository
{
public CountryRepository(IErpBaseUnitOfWork unitOfWork)
: base(unitOfWork)
{
}
// Unnecessary codes removed
public void Modify<TEntity>(TEntity item)
where TEntity : class
{
//this operation also attach item in object state manager
Entry<TEntity>(item).State = EntityState.Modified;
}
}
和unitofwork.commit调用Context。SaveChanges
业务层
public class CountryAppService : ICountryAppService
{
private readonly ICountryRepository _countryRepository;
public CountryAppService(ICountryRepository countryRepository)
{
_countryRepository = countryRepository;
}
public CountryDto RemoveState(int stateId, int countryid)
{
var country = _countryRepository.FindById(countryid);
if (country == null || country.Status == false) throw new ApplicationOperationException(Messages.Validation_CountryInInvalidState) { HttpCode = 400 };
country.DeleteState(stateId);
_countryRepository.Modify(country);
_countryRepository.UnitOfWork.Commit();
return country.ProjectedAs<CountryDto>();
}
}
这里我通过从集合中删除对象来删除状态对象,但是EF会因为孤儿状态的存在而产生错误,我的问题是我如何通过从集合中删除状态来删除状态。考虑要点
1。)我的领域模型对EF及其相关技术没有任何线索,因此在Domian层和Business层中包含少量EF相关代码并不是一个好主意2.) 我使用Db上下文与CodeFirst,
处理这种情况的最佳实践是什么
先来看看ef cascade on delete使用流畅的api,您可以告诉EF在删除主体时删除孤儿。
话虽如此,EF在删除时并不总是允许级联。由于复杂的关系。
在这种情况下,could
将删除子节点放在DAL层逻辑中。如果从域模型的角度来看,删除Main意味着删除所有子节点,我会这样做此服务是期望/需要的。
然而,数据的关联方式通常被视为一个领域层主题。
我把删除子业务逻辑,我有在域层个人。如果Domain层建模并调用触发子删除,我认为没有问题。但是我已经看到,服务层/业务层位于领域层之上,对其进行编排,并且没有问题。我只是把它们当作整体设计的一部分。当然,当服务/业务层负责编排相关的删除时,您已经间接地将域层链接到服务层。域完整性在哪里?
最佳实践取决于您如何定义如何看待域层。这不是StackOverflow的问题。这是一个很大的设计课题问题。也许是为了开始阅读DDDhttp://domaindrivendesign.org/books/