微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

EF 6 是否要求外键具有反映外部表名称的名称?

如何解决EF 6 是否要求外键具有反映外部表名称的名称?

我们正在使用 EF 6 的 Code First with Existing Database。我们正在使用 sql Server 我的老板使用从 TOAD 生成sql 脚本创建表。通常表是按照以下模式创建的:

  • 表名:例如:Person
  • 主键:ID(它总是只是ID)

通常在创建与另一个表具有 1 对 1 或 1 或 0 关系的表时,它是使用以下模式创建的:

  • 表名:地址
  • 主键:ID
  • Person 的外键:PersonID

然而,我的老板用两张桌子打破了他的模式,这让我很伤心。我认为这是因为他将外键命名为不遵循模式的东西,他在其他任何地方都使用过。但我可能是错的。当然,在我看来,EF 的代码首先与现有数据库无法识别这种关系。这是导致问题的两个表的 sql 片段(我正在删除不相关的列):

CREATE TABLE [app].[PersonnelCertification]
(
 [ID] Bigint IDENTITY NOT NULL,[CertificationTypeID] Bigint NOT NULL,[InstrumentModelID] Bigint NOT NULL,[PersonID] Bigint NOT NULL,[AgencyID] Bigint NOT NULL,[CertificationLevelID] Bigint NOT NULL,)

这是 Proficiency 表的 sql 片段:

CREATE TABLE [app].[Proficiency]
(
 [ID] Bigint IDENTITY(1,1) NOT NULL,[PersonCertID] Bigint NOT NULL,[InstrumentID] Bigint NULL,[SolutionID] Bigint NOT NULL,)

ALTER TABLE [app].[Proficiency] ADD CONSTRAINT [PersonnelCertification-Proficiency] FOREIGN KEY ([PersonCertID]) REFERENCES [app].[PersonnelCertification] ([ID]) ON UPDATE NO ACTION ON DELETE NO ACTION
go

ALTER TABLE [app].[Proficiency] ADD CONSTRAINT [Solution-Proficiency] FOREIGN KEY ([SolutionID]) REFERENCES [app].[Solution] ([ID]) ON UPDATE NO ACTION ON DELETE NO ACTION
go

ALTER TABLE [app].[Proficiency] ADD CONSTRAINT [Instrument-Proficiency] FOREIGN KEY ([InstrumentID]) REFERENCES [app].[Instrument] ([ID]) ON UPDATE NO ACTION ON DELETE NO ACTION
go

这是代码首先使用现有数据库生成的结果代码,用于 Proficiency 表:

[Table("app.Proficiency")]
public partial class Proficiency
{
    public long ID { get; set; }

    public long PersonCertID { get; set; }

    public long? InstrumentID { get; set; }

    public long SolutionID { get; set; }

    public virtual Instrument Instrument { get; set; }

    public virtual Solution Solution { get; set; }
}

一个名为 Solution 的表,它与 Proficiency 相关。有一个名为 Instrument 的表与 Proficiency 相关。生成的 Proficiency 模型类中没有与 PersonnelCertification 相关的任何内容。就像我说的,没有名为 PersonCert 的表。

我不知道如何解决这个问题。我曾尝试向 PersonCertID 添加 [ForeignKey] 属性,但这不起作用。我还尝试在 DbContext 生成的类中添加一些代码,用于定义两个表之间的关系,这些表首先使用现有数据库无法识别,但我无法发现什么可行。我很想知道 EF 6 是否使用类似于配置的约定来确定外键关系。比如,PersonCertID 改名为PersonnelCertificationID 会更好吗?或者有没有办法在 DbContext 中指定 Fuild API 来声明 Proficiency 和 PersonnelCertification 之间的关系?

解决方法

希望你能在某个地方拥有一个 class PersonnelCertification,这样你就可以像这样改变你的熟练程度:

Table("app.Proficiency")]
public partial class Proficiency
{
    public long ID { get; set; }

    [ForeignKey(nameof(PersonnelCertification))]
    public long PersonCertID { get; set; }
    public virtual PersonnelCertification PersonnelCertification { get; set; }

    public long? InstrumentID { get; set; }

或者你可以改变它:

public partial class Proficiency
{
    public long ID { get; set; }

    
    public long PersonCertID { get; set; }
    [ForeignKey(nameof(PersonCertID))]
    public virtual PersonnelCertification PersonnelCertification { get; set; }

    public long? InstrumentID { get; set; }

或者您可以更改人员证书:

class PersonnelCertification{

    ...
    
    [ForeignKey(nameof(Proficiency.PersonCertID))]
    public ICollection<Proficiency> Proficiencies

使用最能吸引您将这些东西联系在一起的感觉。我喜欢选项 2

注意,nameof是被编译器转成字符串的;它需要一个 C#“事物”(类、方法、属性等)或“事物的路径”,并给出事物的字符串名称。它很有用,因为它意味着智能感知可以帮助你编写东西,如果你曾经通过内置的重构工具重命名,那么它会更新字符串不会

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。