【问题标题】:Entity Framework 4 (using EDMX), how to add a field into to model that DB does not have the field actually实体框架 4(使用 EDMX),如何将字段添加到数据库实际上没有该字段的模型中
【发布时间】:2012-05-04 03:28:03
【问题描述】:

我需要在模型中添加一个字段,而数据库实际上没有该字段。

因为,首先我尝试只将字段添加到实体类中。

public partial class Weborder
{
  (Auto Generated)
  public int orderno {get; set;}
  .
  .
  .
  (Add Manually)
  public string newField1 {get; set;} //this is new field that DB does not have
  public string newField2 {get; set;} //this is new field that DB does not have
}

之后,当我更新 EDXM 时,EDMX 会删除新字段,因为数据库没有该字段。 :(

所以我手动将该字段添加到 EDMX 模型中。 (添加 -> 标量属性)

然后在编译时出现错误,错误消息说:

Error   1   Error 3004: Problem in mapping fragments starting at line 399:No mapping specified for properties ...
An Entity with Key (PK) will not round-trip when:...

有人知道如何在实体类中添加新字段吗?

谢谢!

编辑用于: 如果你的模型是你的数据库的表示,而数据库中没有字段,为什么要手动添加?

=>

检索数据时,对象的返回类型为实体类。

在将数据从控制器传递到视图之前,我需要将更多数据(字段)添加到 IQueryable 结果中。

例如)

public DbSet<WEBORDERLN> WEBORDERLNs { get; set; }

//repository
public IQueryable<WEBORDERLN> WebOrderLns
{
      get { return context.WEBORDERLNs; }
}

现在我在控制器中获得了 weborderln 数据。在通过视图之前,我需要

在结果中添加额外的数据。

var data = webOrderLnRepository.WebOrderLns.Where(e => e.PICKNO == OrderNo).ToList();

foreach (WEBORDERLN weborderln in data)
{
   weborderln.[NEW FIELD] = "EXTRA DATA";   //// FOR THIS, I NEED TO ADD NEW FILED INTO ENTITY CLASS
}

//return data

我希望它可以解释这个问题:)

再次感谢。

【问题讨论】:

  • 如果你的模型是你的数据库的表示,而在数据库中你没有字段,为什么要手动添加呢?
  • @Dante,感谢您的关注。我再次编辑了我的问题,请检查我的问题。如果您有任何想法,请给我建议。
  • 您基本上是在描述使用 ViewModel 的场景——也就是说。从数据模型映射并从视图派生的模型,用于将数据传递到(并可能从)视图。现在我一直想知道在实体框架本身中构建 ViewModel 有多么容易(因为我可能想使用和查询 OData 服务等),但我不知道它们是否真的属于那里。

标签: asp.net asp.net-mvc entity-framework entity-framework-4 edmx


【解决方案1】:

首先,您不应该修改数据模型文件。此文件代表您的数据。

其次,您不应该从您的存储库中返回您的数据模型对象/集合。这是一个非常糟糕的做法,因为您正在创建控制器/视图和模型之间的依赖关系。我建议您创建包含视图中所需属性的自定义模型对象,将您的实体映射到这些模型对象,并仅从您的存储库返回模型对象或模型对象的集合。

【讨论】:

    【解决方案2】:

    您必须创建实体类的新部分(在新的 .cs 文件中)并向该类添加新字段。您不得修改自动生成创建的部分零件,因为每次更改 EDMX 文件时都会覆盖自动生成的文件。您也不能在 EDMX 中包含该字段,因为 EDMX 定义了您到数据库的映射 = 它仅包含数据库中的字段。

    在与自动生成的类相同的程序集和命名空间中创建一个新文件 WebOrderPart.cs,其中包含:

    public partial class Weborder
    {
      public string newField1 {get; set;} 
      public string newField2 {get; set;} 
    }
    

    【讨论】:

    • 感谢您的回答!您能否给我更多提示“您必须创建实体类的新部分部分(在新的 .cs 文件中)并向该类添加新字段。”?
    • 我为实体创建了一个新类并将所有原始代码复制到新文件(WEBORDERLN2.cs)中,并将上下文和存储库返回类型对象修改为 WEBORDERLN2。但发生错误,它说“实体类型 WEBORDERLN2 不是当前上下文模型的一部分。”你对此有什么想法吗?谢谢!
    • 不是新课程。你知道 C# 中的 partial 关键字是什么意思吗?它允许您在多个文件中定义一个类。该类必须与 EF 生成的类相同 - 只有生成的代码与您的自定义属性位于不同的文件中。
    • 现在可以了!惊人的!!!!! N 我现在了解“部分”。非常感谢!
    【解决方案3】:

    [NotMapped] 不起作用。

     [NotMapped]
     public string newField1 {get; set;}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多