我的域对象具有以下结构
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层中包含很少的Ef相关代码也不是一个好主意 2.)我正在使用Db Context和CodeFirst,
可用于处理此类情况的最佳做法是什么
答案 0 :(得分:0)
首先查看ef cascade on delete 使用流畅的api,您可以告诉EF在删除委托人时删除孤儿。
话虽如此,EF并不总是允许级联删除。由于关系复杂。
在这种情况下,您could
将删除子项放在DAL层逻辑中。
如果从域模型的角度来看,我会这样做,删除Main Implies删除所有孩子
这项服务是预期/必需的。
然而,数据的相关方式通常被视为域层主题。
我将删除子项放在Domain层中的业务逻辑中。 如果Domain层建模并且调用触发子删除,我认为没有问题。 但是我已经看到并且没有问题在服务层/业务层位于编排它的域层之上。我只是将它们视为整体设计的一部分。间接当然,当负责编排相关删除的服务/业务层时,您已将域层链接到服务层。域名完整性在哪里?
最佳做法取决于您如何定义域图层的定义方式。 那真的不是StackOverflow问题。这是一个非常大的设计主题问题。 也许开始阅读DDD http://domaindrivendesign.org/books/