【问题标题】:Entity framework code first, custom foreign key name for inheritance实体框架代码优先,自定义外键名进行继承
【发布时间】:2017-04-22 14:39:06
【问题描述】:

我有一个名为 MyEntity 的类

public class MyEntity
{
    public int Id { get; set; }

    [Required]
    [StringLength(300)]
    public string Name { get; set; }
}

还有一个继承类 HubEntity

public class HubEntity : Entity
{
  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.None)]
  public int EntityId { get; set; }

  [Required]
  [StringLength(300)]
  public string RootName { get; set; }
}

这是基于数据库中现有的表。每个班级都有一张桌子。因此HubEntity 表中的EntityId 字段引用Entity 表中的Id 字段。

为了避免破坏现有数据库,我在一个空数据库上运行我的代码并让 EF 创建表:

我担心的是 HubEntity 表是由 Id 和 EntityId 字段构建的,ID 字段被设计为 Entity 表的外键。我不知道如何获取 EntityId 字段作为外键。

我尝试将其标记为 [ForeignKey("Entity")],但随后出现异常:程序在 HubEntity 中查找指向实体的实体属性,这不是我想要的,因为它是遗产。

我首先使用 DB 创建了应用程序,模型的外观如下:

提前感谢您的帮助。

塞德里克

【问题讨论】:

  • 你错误的继承和外键概念,它们不一样,另外,这不是代码优先:这些是部分类,所以它是数据库优先...
  • 嗯……貌似是db优先,partial classes不代表table,只是一个ADD up,是你需要改的model
  • 毫无疑问:我首先创建了数据库并在其上构建了我的应用程序的第一个版本,首先使用数据库。在这个版本中,模型基于两张表实现了Entity->HubEntity的继承。由于某些原因,我决定首先使用我不太熟悉的代码从头开始重建应用程序。我想实现每个类型的继承表,我唯一关心的是这个外键。我并没有将db端的外键概念和代码端的继承混为一谈,但我知道使用TPT,代码中的继承是通过表中的外键实现的。
  • 部分类来自visual studio在现有db上实现code-first时逆向工程生成的代码。
  • 您不能仅使用部分类构建数据库优先方法,您的模型是什么样的?喜欢这个人:stackoverflow.com/questions/40937111/data-displaying-null-types/… 看看他的 db 第一个模型...

标签: entity-framework inheritance ef-code-first foreign-keys


【解决方案1】:

好的,明白了。

MyEntity 类没问题。

public class MyEntity
{
    public int Id { get; set; }

    [Required]
    [StringLength(300)]
    public string Name { get; set; }
}

继承的类 HubEntity 不能包含 EntityId 字段:

public class HubEntity : Entity
{
  [Required]
  [StringLength(300)]
  public string RootName { get; set; }
}

现在,在MyModel.csOnModelCreating 中,添加以下子句:

  modelBuilder.Entity<HubEntity>()
    .Property(e => e.Id)
    .HasColumnName("EntityId");

外键将生成所需的名称。 :)

【讨论】:

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