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 6.1.1的孤儿对象问题

先来看看ef cascade on delete使用流畅的api,您可以告诉EF在删除主体时删除孤儿。

话虽如此,EF在删除时并不总是允许级联。由于复杂的关系。

在这种情况下,could将删除子节点放在DAL层逻辑中。如果从域模型的角度来看,删除Main意味着删除所有子节点,我会这样做此服务是期望/需要的。

然而,数据的关联方式通常被视为一个领域层主题。

我把删除子业务逻辑,我有在域层个人。如果Domain层建模并调用触发子删除,我认为没有问题。但是我已经看到,服务层/业务层位于领域层之上,对其进行编排,并且没有问题。我只是把它们当作整体设计的一部分。当然,当服务/业务层负责编排相关的删除时,您已经间接地将域层链接到服务层。域完整性在哪里?

最佳实践取决于您如何定义如何看待域层。这不是StackOverflow的问题。这是一个很大的设计课题问题。也许是为了开始阅读DDDhttp://domaindrivendesign.org/books/