【问题标题】:Orphaned Child Objects issues with EF 6.1.1EF 6.1.1 的孤立子对象问题
【发布时间】:2014-07-04 17:50:10
【问题描述】:

我有以下结构的域对象

   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 一起使用,

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

【问题讨论】:

  • 你解决过这个问题吗?

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


【解决方案1】:

首先查看ef cascade on delete 使用 fluent api,您可以告诉 EF 在删除主体时删除孤儿。

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

在这种情况下,您 could 将删除子项放入您的 DAL 层逻辑中。 如果从域模型的角度来看,我会这样做,删除主要暗示删除所有子项 并且该服务是预期/需要的。

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

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

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

【讨论】:

    猜你喜欢
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2016-02-18
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    相关资源
    最近更新 更多