建模使用相同的未更改数据库的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。
至于你的例子,有两件事:
- 你建模的关系不是一对多,而是一对一。 Public Banco Banco {get;组;}
改成:
Public ICollection<Banco> Bancos {get;set;}
有几种方法可以建模与EF的关系。这是Modeling 1 to many relationships in EF.的样本
- 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名称的主要内容,如果未能解决你的问题,请参考以下文章