Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将派生类型映射到EF中的同一个表_C#_Entity Framework - Fatal编程技术网

C# 将派生类型映射到EF中的同一个表

C# 将派生类型映射到EF中的同一个表,c#,entity-framework,C#,Entity Framework,下面的简单代码示例演示了所讨论的场景。我有一个Person实体,它只是映射到DB中的Person表。我正在使用默认的实体对象代码生成器 public partial class Person { ... } 我有一个Person派生的PersonDetail类,它包含GUI所需的一些额外属性。这些属性都不需要在数据库中持久化,因此我不想将此类映射到数据库 public class PersonDetail : Person { public int TheGuiNeedsThisInf

下面的简单代码示例演示了所讨论的场景。我有一个Person实体,它只是映射到DB中的Person表。我正在使用默认的实体对象代码生成器

public partial class Person { ... }
我有一个Person派生的PersonDetail类,它包含GUI所需的一些额外属性。这些属性都不需要在数据库中持久化,因此我不想将此类映射到数据库

public class PersonDetail : Person
{
    public int TheGuiNeedsThisInformation { get; set; }
}
我用WCF将Detail类的实例发送到GUI。 我的问题是,如果GUI修改PersonDetail实例的某些属性,并将其发送回服务器进行更新,我不能简单地将其附加到上下文,因为派生类没有映射到任何表(“无法找到EntityType PersonDetail的映射和元数据信息”)。我试图将它映射到与Person类映射相同的表,但是EF以这种方式引发了一些关于映射的异常

我通过将PersonDetail实例的属性值复制到一个新的Person实例,然后将其保存到DB,从而创建了PersonDetail实例的副本,从而解决了这个问题。然而,我想避免额外的工作。我做错了什么?这不可能吗?在LinqtoSQL中,这就像一种魅力,基本上是开箱即用的

如果这是不可能的,建议用什么方法来扩展我的实体类,添加一些不需要持久化的额外信息?(显而易见的方法是简单地向partial Person类添加额外属性。但是,我不想这样做,因为那样GUI永远无法确定额外属性是否已在服务器上填充。)


更新:感谢您的建议,但是我的主要问题仍然是:是否可以将基类和派生类(其中派生类没有任何必须保存到DB的附加属性)映射到同一个表,这样我就可以简单地将派生类型的实例附加到上下文中,并像保存基类型的实例一样保存它?我还不能做到这一点,我很惊讶,因为使用Linq to SQL,它可以简单地工作。

您可以将属性添加到类中,并使用modelBuilder为实体框架“忽略”它们,看起来就像您在进行代码优先开发一样。对于这些选项,请查看modelBuilder=>

    public class Db : DbContext
    {
      public DbSet<MyClass> MyClasses{ get; set; }

      protected override void OnModelCreating(DbModelBuilder modelBuilder)
      {
        modelBuilder.Entity<MyClass>().Ignore(x => x.MyProperty);
      }
    }
公共类Db:DbContext
{
公共DbSet MyClasses{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().Ignore(x=>x.MyProperty);
}
}

希望这有帮助

我认为继承不是这个问题的正确答案。“PersonDetail”真的是一个人吗? 我会选择创建PersonDetail类,并在分部类中添加指向PersonDetail类实例的属性


这样,您就可以在客户端检查PersonDetail是否由服务器设置,只需检查属性!=空。

您是否尝试过使用组合而不是继承

public class PersonViewModel {
  public Person Person { get; }
  public int? MyViewProperty { get; set; }
  // ...
}

除非有很好的理由,否则我永远不会将该对象转移到您的服务中。对我来说,它看起来只是一个客户端对象。当GUI属性没有存储在数据库中时,将它们传输到服务器有什么意义?仅仅
找到
此人并将其发送到服务器进行更新,还不够吗?

谢谢您的回答。抱歉,我不清楚,我没有先编写代码,目前我使用默认的实体对象生成器,但是我计划切换到STEs或POCOs.Ok。实体框架对象生成器基本上是T4模板(代码生成器)。实体对象生成器生成ObjectContext或DbContext。你可以像我说的那样改变它。谢谢你的回答,这是我没有想到的。但是,这类似于向部分添加额外属性,因为GUI只能在运行时决定是否加载了详细信息,而继承则可以在设计时决定(当然,这并不完全正确,但是我希望方法签名与返回时是否包含详细信息相似)然后,您可以始终使用自定义DTO,但当您将DTO更新回服务时,您必须将更改映射到实体对象。嗯,我不想映射更改,因为这些额外的属性永远不会更改,它们只是为了在GUI上显示。但我想轻松地决定一种方法(可能是通过查看其返回值类型),无论是仅返回“基本”信息,还是同时加载详细信息