EF 6.1.1中的孤立子对象问题

时间:2014-07-04 17:50:10

标签: c# .net asp.net-mvc entity-framework ef-code-first

我的域对象具有以下结构

   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,

可用于处理此类情况的最佳做法是什么

1 个答案:

答案 0 :(得分:0)

首先查看ef cascade on delete 使用流畅的api,您可以告诉EF在删除委托人时删除孤儿。

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

在这种情况下,您could将删除子项放在DAL层逻辑中。 如果从域模型的角度来看,我会这样做,删除Main Implies删除所有孩子 这项服务是预期/必需的。

然而,数据的相关方式通常被视为域层主题。

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

最佳做法取决于您如何定义域图层的定义方式。 那真的不是StackOverflow问题。这是一个非常大的设计主题问题。 也许开始阅读DDD http://domaindrivendesign.org/books/