建模使用相同的未更改数据库的FK名称

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了建模使用相同的未更改数据库的FK名称相关的知识,希望对你有一定的参考价值。

我正在使用EF6但是......我无法更改数据库。所以,如果我没错,我需要创建一个适合数据库的模型。

我必须在一对多的关系模型:

[Table("ReceCli")]
    public class ReceCli
    {
        [Key]
        public int Indice { get; set; }

        [Required, StringLength(12)]
        [Display(Name = "Nº Documento")]
        public string NDOC { get; set; }

        [Display(Name = "Banco do boleto")]
        [Column("CodBancoBoleto")]
        public int CodBancoBoleto { get; set; }
        public Banco Banco { get; set; }

    }

[Table("Bancos")]
    public class Banco
    {
        [Key]
        public int CodBanco { get; set; }

        [Column("Banco")]
        [Required, StringLength(50)]
        [Display(Name = "Banco")]
        public string Nome { get; set; }
    }

在数据库中,这种关系表达如下:

ALTER TABLE [dbo].[ReceCli]  WITH NOCHECK ADD  CONSTRAINT [ReceCli_CodBancoBoleto] FOREIGN KEY([CodBancoBoleto])
REFERENCES [dbo].[Bancos] ([CodBanco])
GO
ALTER TABLE [dbo].[ReceCli] CHECK CONSTRAINT [ReceCli_CodBancoBoleto]

执行时返回错误:

列名称'Banco_CodBanco'无效。

我无法更改数据库。

如何将模型更改为EF使用ReceCli_CodBancoBoleto列的名称而不是Banco_CodBanco?

答案

你可以手工建模现有的数据库,但你也可以告诉EF到generate the model from an existing database

至于你的例子,有两件事:

  1. 你建模的关系不是一对多,而是一对一。 Public Banco Banco {get;组;}

改成:

Public ICollection<Banco> Bancos {get;set;}

有几种方法可以建模与EF的关系。这是Modeling 1 to many relationships in EF.的样本

  1. Column属性用于匹配DB中的名称。确保与数据库不匹配的EF CF属性具有列属性。对于您的RecCli,它应该看起来像: [Column("CodBanco")] public int CodBancoBoleto { get; set; }

要么

 public int CodBanco { get; set; }

但是,您正在映射1到多个关系,因此不需要CodBancoBoleto。只需使用Public ICollection<Banco> Bancos {get;set;}的导航属性即可。这应该足够了,除非你可能必须为它设置一个ForeignKey属性,告诉它使用CodBanco作为导航的关键。

[ForeignKey("CodBanco")] 
Public ICollection<Banco> Bancos {get;set;}

您可能必须为所有密钥执行此操作,因为密钥的默认代码优先约定以Id结尾。我说可能因为你的Banco Class的钥匙被正确命名为CodBanco并标有钥匙。所以你可能没事。

最后要注意的是,您似乎正在尝试使用约束名称进行映射。您不使用约束名称,而是使用实际列名称,也就是约束的引用部分。

以上是关于建模使用相同的未更改数据库的FK名称的主要内容,如果未能解决你的问题,请参考以下文章

实体名称更改时核心数据建模器不更新

删除未命名的约束

外键(FK_ 必须与引用的主键具有相同的列数

sql数据建模器中的外键问题

CPNtools协议建模安全分析---实例变迁标记

为什么雄辩地在FK名称上添加下划线?