我的应用程序中有一个数据层和业务层 在数据层中,我使用实体框架将数据库表导入为对象 其中一个是单位表格。例如 现在在业务层我想向数据层单元添加一些方法,所以我有这个类:
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中加载业务类吗?
由于
答案 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)
您无法直接将父对象强制转换为子对象。您问题的可能解决方案:
在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;
}
重写您的Business.Entity.Unit
类,使其不继承Data.Unit
,但接受Data.Unit
实体作为构造函数参数,聚合它(存储在本地私有成员中)和提供包装器属性和操作它的功能
完全删除您的Business.Entity.Unit
课程,并将所有其他方法实施为extension methods。
我投票给第三个,因为恕我直言,它使代码更清晰,并且没有引入和管理其他实体的开销。