【问题标题】:EF Code First - How do you specify foreign key name for child object table used by different type of parentsEF Code First - 如何为不同类型的父对象使用的子对象表指定外键名称
【发布时间】:2014-11-25 15:02:12
【问题描述】:

我有一些看起来像这样的对象:

abstract public class Field
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Ordinal { get; set; }
}

[Table("DropDownField")]
public class DropDownField : Field
{
    public virtual List<FieldOption> Options { get; set; }
}

[Table("RadioButtonField")]
public class RadioButtonField : Field
{
    public virtual List<FieldOption> Options { get; set; }
}

public class FieldOption
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}

在我的数据库中,它最终使用 Code First 创建了一个 FieldOptions 表。但是,它会创建以下列:

  • 身份证
  • 姓名
  • 价值
  • DropDownField_Id
  • RadioButtonField_Id

我希望看到的只是此表中的一个 Field_Id,因为字段的 Id 在不同类型的字段中必须是唯一的。

有没有办法做到这一点?我已经进行了一些搜索,但我一定不知道用于查找答案的正确搜索词。

【问题讨论】:

  • 在您的情况下,您可以尝试将列表放在基类上。
  • 我可以这样做,但是还有其他字段类型(例如 TextBoxField)不需要包含选项。我只是没有将它们包含在示例中。

标签: c# sql-server entity-framework ef-code-first code-first


【解决方案1】:

恕我直言,从关系数据库的角度来看,您想要的是一个列 (Option.FieldId),它是 2 个表 DropDownField 和 RadioButtonField 的外键。

也就是说,每当您插入选项时,FieldId 必须引用现有的 DropDownField 和现有的 RadioButtonField。

这至少很奇怪。

我认为这不能/不应该实现。

【讨论】:

  • 对,这很奇怪,但 Option.FieldId 可能会引用 Field 表的 Id。在当前的数据库结构中,创建了三个表:Field、DropDownField 和 RadioButtonField。 DropDownField 或 RadioButtonField 中的任何 Id 在 Field 表中都有对应的 Id。其他表只存储任何唯一值。
  • 老实说,我为这个问题寻找了很长一段时间的“优雅”解决方案,我什至把它排在了我的脑海里。但是当我面对 DBA 的观点,尤其是完整性约束时,我不再将其视为一个“阻塞”问题。
猜你喜欢
  • 1970-01-01
  • 2012-11-16
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多