【问题标题】:Inheriting from auto-generated classes in Entity Framework从实体框架中自动生成的类继承
【发布时间】:2014-10-14 02:22:34
【问题描述】:

我正在使用 MVC 4 和实体框架进行项目。

我已经使用从数据库中自动生成的类创建了实体模型。但是,我希望模型中的类有不同的名称和方法。

比如已经生成了这个类:

 public partial class tbl_Templates
    {
        public tbl_Templates()
        {
            this.tbl_Template_Sections = new HashSet<tbl_Template_Sections>();
        }

         public int TemplateId { get; set; }

         //...
    }

但我不想使用这个类,所以我在建模器中创建了自己的类:

public class Template : tbl_Templates
{
    public Template()
        : base()
    {

    }

    // I'll add custom methods later
}

现在,我如何在控制器中使用这个?

我试过了:

  List<Template> Templates =db.tbl_Templates.Cast<Template>().ToList();

但我得到了例外:

LINQ to Entities 仅支持转换 EDM 基元或枚举类型。

【问题讨论】:

  • 为什么不直接重命名模型中的类?
  • 因为我还想创建分离层:数据访问(tbl_* 自动生成的类)和业务逻辑
  • 如果你做了ToList().Cast&lt;Template&gt;(),这行得通吗?
  • 不,我收到Unable to cast object of type 'System.Data.Entity.DynamicProxies.tbl_Templates_BDCB2400F8F15817C025FC5304B7B50595C8747A92C936DFB2D4412FA01BB315' to type 'Project1.Models.Template'.
  • 如果您使用继承,您仍然会将底层对象暴露给客户端。如果您不想这样做,则必须创建一些其他模型(也许是查看模型?)并映射属性。 Automapper 会很好地做到这一点。

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


【解决方案1】:

您需要 SelectTemplate 并映射所有属性。像这样的

List<Template> Templates = db.tbl_Templates.Select(x => new Template { 
                                                            .TemplateID = x.TemplateID 
                                                   }).ToList();

如果两种类型具有相同的属性名称,您可以使用AutoMapper 自动执行此操作。他们有docs 关于如何使用可查询扩展。这是一个示例

Mapper.CreateMap<tbl_Templates, Template>();

List<Templates> Templates = db.tbl_Templates.Project().To<Template>().ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2010-10-07
    • 1970-01-01
    • 2017-09-04
    相关资源
    最近更新 更多