如何加载从数据层继承的业务对象(欢迎新的答案)

时间:2012-06-06 10:51:59

标签: asp.net entity-framework-4 casting layer n-tier-architecture

我的应用程序中有一个数据层和业务层 在数据层中,我使用实体框架将数据库表导入为对象 其中一个是单位表格。例如 现在在业务层我想向数据层单元添加一些方法,所以我有这个类:

namespace Business.Entity
{
    public class Unit : Data.Unit 
    {
     //Some business affairs here
    } 
}

对于在UI中加载单元,我在业务层中创建了一个存储库:

    public static IEnumerable<Data.Unit> LoadUnits()
    {
        return from entity in StaticDataContext.Units select entity;
    }

到目前为止一切都很好。

但是我想在UI中加载 Business.Unit 列表,所以我写了这个:

    public static IEnumerable<Business.Entity.Unit> LoadUnits()
    {
        var result = (from entity in StaticDataContext.Units
                      select entity).ToList().Cast<Business.Entity.Unit>();
        return result;
    }

它编译得很好但是在将它绑定到Grid时我得到了这个运行时错误:

InvalidCastException: Unable to cast object of type 'Data.Unit' to type 'Business.Entity.Unit'

任何人都可以说如何安排类以便能够在UI中加载业务类吗?

由于

2 个答案:

答案 0 :(得分:1)

尝试以下方法,返回您的类Business.Entity.Unit对象列表,而不是转发到另一个类。

public static IEnumerable<Business.Entity.Unit> LoadUnits()
        {
            var result = (from entity in StaticDataContext.Units
                          select new Business.Entity.Unit { 
                          ///set properties of this class as 
                          Id = entity.ID, .. son  
                          }).ToList();
            return result;
        }

我建议你阅读ScottGu关于Code-First Development with Entity Framework 4的文章。

答案 1 :(得分:1)

您无法直接将父对象强制转换为子对象。您问题的可能解决方案:

  1. Business.Entity.Unit类中创建一个构造函数,接受Data.Unit作为参数并分配所有必需的属性,如:

    namespace Business.Entity
    {
        public class Unit : Data.Unit 
        {
            public Unit(Data.Unit parent)
            {
                // Assign proprties here
            }
            //Some business affairs here
        } 
    }
    

    之后你可以这样做:

    public static IEnumerable<Business.Entity.Unit> LoadUnits()
    {
        var result = (from entity in StaticDataContext.Units
                      select new Business.Entity.Unit(entity)).ToList().Cast<Business.Entity.Unit>();
        return result;
    }
    
  2. 重写您的Business.Entity.Unit类,使其不继承Data.Unit,但接受Data.Unit实体作为构造函数参数,聚合它(存储在本地私有成员中)和提供包装器属性和操作它的功能

  3. 完全删除您的Business.Entity.Unit课程,并将所有其他方法实施为extension methods

  4. 我投票给第三个,因为恕我直言,它使代码更清晰,并且没有引入和管理其他实体的开销。