0

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

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;
    }

它编译得很好,但是在将它绑定到网格时出现了这个运行时错误:

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

谁能说如何安排类以在 UI 中加载业务类?

谢谢

4

2 回答 2

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 关于使用 Entity Framework 4 进行代码优先开发的文章。

于 2012-06-06T10:59:10.600 回答
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类并将所有其他方法实现为扩展方法

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

于 2012-06-06T10:59:34.827 回答