簡體   English   中英

EF 6.1.1的孤立子對象問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM