[英]Orphaned Child Objects issues with EF 6.1.1
我有以下結構的域對象
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或其相關技術一無所知,因此在業務層2中的Domian層中只包含少量與Ef相關的代碼也不是一個好主意。)我在Db Context中使用CodeFirst,
有哪些最佳實踐可用來處理此類情況
首先查看刪除時的ef級聯使用流利的api,您可以告訴EF當刪除主體時,孤兒也已刪除。
話雖如此,EF並不總是允許級聯刪除。 由於關系復雜。
在這種情況下,您could
將刪除子級放入DAL層邏輯中。 如果從域模型的角度來看,我會這樣做,即刪除Main意味着刪除所有子項,並且此服務是預期/必需的。
但是,數據關聯的方式通常被視為域層主題。
我將刪除子級放在我個人在Domain層中擁有的業務邏輯中。 如果域層對此建模並調用觸發了子刪除,我認為沒有問題。 但是,我已經看到,位於領域層之上的服務層/業務層編排沒有問題。 我只是將它們視為整體設計的一部分。 當負責協調相關刪除的服務/業務層時,您當然間接地將域層鏈接到服務層。 域完整性在哪里?
最佳實踐取決於您如何定義如何查看域層。 這確實不是一個StackOverflow問題。 這是一個很大的設計主題問題。 也許要開始閱讀DDD http://domaindrivendesign.org/books/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.