C# EF代码首先为一个字段创建了两个属性

C# EF代码首先为一个字段创建了两个属性,c#,.net,entity-framework,C#,.net,Entity Framework,在数据库中,我有两个表-Show和Language。表中显示除其他外还有外键语言。它的一对多关系(节目有一种语言) 首先从ADO.NET实体数据模型运行代码时,会为语言字段创建两个属性: public class ShowModel { ... public LanguageModel Language1 {get; set;} public string Language {get; set;} ... } public class LanguageModel

在数据库中,我有两个表-Show和Language。表中显示除其他外还有外键语言。它的一对多关系(节目有一种语言)

首先从ADO.NET实体数据模型运行代码时,会为语言字段创建两个属性:

public class ShowModel
{
    ...
    public LanguageModel Language1 {get; set;}
    public string Language {get; set;}
    ...
}

public class LanguageModel
{
    ...
    public string Language {get; set;}
    ...
}
当我调试样本数据时,DB中语言字段的值被插入到字符串属性中

问题是——为什么它会生成这些属性?是因为我可以将Language对象添加到LanguageModel 1中,但从DB中,它总是写入string 1吗

编辑

modelBuilder.Entity<LanguageModel>()
            .HasMany(e => e.Shows)
            .WithOptional(e => e.Language1)
            .HasForeignKey(e => e.Language);

modelBuilder.Entity<ShowModel>()
            .Property(e => e.Language)
            .IsUnicode(false);
modelBuilder.Entity()
.HasMany(e=>e.Shows)
.WithOptional(e=>e.Language1)
.HasForeignKey(e=>e.Language);
modelBuilder.Entity()
.Property(e=>e.Language)
.IsUnicode(假);

如果您暗示字段“Language”是“Laguage1”导航属性的Language表的外键,那么我可以给您几个指针:

  • 语言表中的键是您的语言属性,但可能未标记为键。EF不会自行解决这个问题,除非您命名字段Id或其他名称,或使用[Key]属性标记它

  • EF不将“Language”字段视为外键,但作为另一个标量属性,这将导致Show属性上有两个语言字段。这可以通过告诉ModelBuilder使用正确的导航属性来解决

  • 解决第2个问题的语法与此类似:

    modelBuilder.Entity<ShowModel>()
      .HasRequired(t => t.Language1) 
      .WithMany(t => t.Shows)
      .HasForeignKey(d => d.Language);
    
    modelBuilder.Entity()
    .HasRequired(t=>t.Language1)
    .WithMany(t=>t.Shows)
    .HasForeignKey(d=>d.Language);
    
    如果您暗示字段“Language”是“Laguage1”导航属性的Language表的外键,那么我可以给您几个指针:

  • 语言表中的键是您的语言属性,但可能未标记为键。EF不会自行解决这个问题,除非您命名字段Id或其他名称,或使用[Key]属性标记它

  • EF不将“Language”字段视为外键,但作为另一个标量属性,这将导致Show属性上有两个语言字段。这可以通过告诉ModelBuilder使用正确的导航属性来解决

  • 解决第2个问题的语法与此类似:

    modelBuilder.Entity<ShowModel>()
      .HasRequired(t => t.Language1) 
      .WithMany(t => t.Shows)
      .HasForeignKey(d => d.Language);
    
    modelBuilder.Entity()
    .HasRequired(t=>t.Language1)
    .WithMany(t=>t.Shows)
    .HasForeignKey(d=>d.Language);
    
    它不应该在那里,语言只能有它的id和字符串。这不是语言模型的一部分,它是ShowModel的一部分。语言生成正确我将编辑一点主要问题它不应该存在,语言只能有它的id和字符串这不是语言模型的一部分,它是ShowModel的一部分。语言生成正确我将编辑一点主要问题是的,这几乎就是“问题”。我不确定这是否真的是个问题,但我更想知道为什么会有这样的问题。第一:所以在DB中我把语言标记为PK,但这是生成的问题还是其他问题?No.2:模型生成器在实体ShowModel语言中仅标记为属性,但在LanguageModel实体中,它为与Show连接的ForeignKey创建了类似的代码(我将在主帖子中添加代码)。如果我理解得很好,如果我添加了这段代码,我可以删除fromShowModelLanguage属性并将其保留在Language模式中?也许我理解这个问题。字符串属性语言是数据库中字段的值,并与LanguageModel中的语言属性相连接?LanguageModel Language1是指向LanguageModel对象的指针吗?如果您不执行任何操作,EF会将Language属性视为标量属性(并将其保存为数据库中的字符串)。它将Language1视为导航属性,并在DB中为其创建外键(此属性在您的模型中不可见)。如果您想让Language成为导航属性Laguage1的FK属性,则必须告诉EF情况就是这样。在某些情况下,EF将从属性类型和命名(例如语言和LanguageId)中检测到这一点。但如果不确定,它会将它们视为不相关的属性,并生成“幕后”FK。如果这有助于您解决问题,请将此标记为您的答案。好的,现在我明白您的意思了。Language是数据库中外键属性的值(本例中为字符串)。Language1是实体LanguageModel的导航属性。您可以使用其中一个来更新实体之间的链接。EntityFramework默认情况下会同时公开这两个属性,因此当您想要更新节目时,可以选择使用FK属性,而不是生成整个语言对象,并且您知道FK.Yep,这几乎就是“问题”。我不确定这是否真的是个问题,但我更想知道为什么会有这样的问题。第一:所以在DB中我把语言标记为PK,但这是生成的问题还是其他问题?No.2:模型生成器在实体ShowModel语言中仅标记为属性,但在LanguageModel实体中,它为与Show连接的ForeignKey创建了类似的代码(我将在主帖子中添加代码)。如果我理解得很好,如果我添加了这段代码,我可以删除fromShowModelLanguage属性并将其保留在Language模式中?也许我理解这个问题。字符串属性语言是数据库中字段的值,并与LanguageModel中的语言属性相连接?LanguageModel Language1是指向LanguageModel对象的指针吗?如果您不执行任何操作,EF会将Language属性视为标量属性(并将其保存为数据库中的字符串)。它将Language1视为导航属性,并在DB中为其创建外键(此属性在您的模型中不可见)。如果您想让Language成为导航属性Laguage1的FK属性,则必须告诉EF