Entity framework core 如何定义应该使用哪个外键导航属性?

Entity framework core 如何定义应该使用哪个外键导航属性?,entity-framework-core,navigation-properties,Entity Framework Core,Navigation Properties,我有两个模型课 注册 public class Registration { // PK public int Id { get; private set; } // FK's public string AspNetUsersId { get; private set; } public int TimetableId { get; private set; } // EF Navigation properties publ

我有两个模型课

注册

public class Registration
{
    // PK
    public int Id { get; private set; }
    
    // FK's
    public string AspNetUsersId { get; private set; }
    public int TimetableId { get; private set; }

    // EF Navigation properties
    public Timetable Timetable { get; set; }
    public ApplicationUser ApplicationUser { get; set; }

    // EF ctor
    private Registration()
    {
    }

    // public ctor
    public Registration(string aspNetUsersId, int timetableId)
    {
        AspNetUsersId = aspNetUsersId;
        TimetableId = timetableId;
    }
}
应用程序用户

public class ApplicationUser : IdentityUser
{
   // some not relevant columns
}
当我尝试执行此代码时

var registrationExists = _context.Registrations
     .Where(x => x.AspNetUsersId == user.Id 
          && x.TimetableId == timetable.Id)
     .SingleOrDefault();
我犯了个错误

Microsoft.Data.SqlClient.SqlException:'无效的列名 “applicationSerid”

我认为这是因为EF试图在数据库中查找(默认约定)
Registration.applicationserid
列,因为
ApplicationUser
导航属性。但是属性(和sql列)的名称是
AspNetUsersId
,而不是
applicationserid
。如何在模型生成器(dbContext)中重写此命名

我试过类似的东西

modelBuilder.Entity<Registration>(b => 
{
    b.HasAlternateKey(x => x.AspNetUsersId);
    b.HasOne(n => n.ApplicationUser); 
});
modelBuilder.Entity(b=>
{
b、 HasAlternateKey(x=>x.AspNetUsersId);
b、 HasOne(n=>n.ApplicationUser);
});

但我没有想到如何将其映射到一起。

您可以在字段上编写注释,例如

// PK
[Key]
public int Id { get; private set; }
    
// FK's
[ForeignKey(nameof(AspNetUsersId))]
public string AspNetUsersId { get; private set; }
[ForeignKey(nameof(TimetableId ))]
public int TimetableId { get; private set; }
现在,[key]属性是主键,[ForeignKey()]属性是FK属性

您还可以使用modelBuilder:

modelBuilder.Entity<Registration>( 
  .HasAlternateKey(x => x.AspNetUsersId)
  .HasOne(n => n.ApplicationUser)
  .WithMany()
  .HasForeignKey(f => f.AspNetUsersId);
modelBuilder.Entity(
.HasAlternateKey(x=>x.AspNetUsersId)
.HasOne(n=>n.ApplicationUser)
.有很多
.HasForeignKey(f=>f.AspNetUsersId);
)


最好阅读整个关系主题-它解释了术语、它们的含义以及如何配置不同方面。比如说“要在Fluent API中配置关系,首先要确定构成关系的导航属性
HasOne
HasMany
标识开始配置的实体类型上的导航属性……然后将调用链接到
WithOne
WithMany
,以标识反向导航
HasOne/WithOne
用于参考导航属性,
HasMany/WithMany
用于集合导航属性。“简单地说,您需要
HasXXX
然后是
WithXXX
,以便获得其他方法,如
HasForeignKey
等。我尝试使用
HasOne
方法,但它没有任何其他方法来配置外键。我必须对许多使用
,但是我配置的是双向关系,而不是单向关系。所以我真的不知道如何配置它。但是现在,它可以使用
ApplicationUser
属性上方的数据注释属性
[ForeignKey(“AspNetUsersId”)]
。但是我不知道如何在ModelBuilder中设置相同的功能?在上一个链接的正下方-。如果没有导航属性,请使用
WithXXX()
w/o传递选择器。在您的例子中,
b.HasOne(n=>n.ApplicationUser).WithMany().HasForeignKey(…)
。同样,所有这些都在文档中用示例进行了解释,只需要阅读整个主题。我看不出发布答案的价值,因为它基本上是针对您的模型调整的文档的复制/粘贴。在这里可以看到功能强大的fluent API和所有数据注释:谢谢,外键注释属性完成了这个技巧
[ForeignKey(“AspNetUsersId”)]public ApplicationUser ApplicationUser{get;set;}
,但是您知道,如何使用Fluent API(model builder)设置外键?在同一站点()上,还介绍了如何设置外键:例如:.HasForeignKey(bc=>bc.BookId);您能否用正确的属性或模型生成器代码(正如@IvanStoev在评论中所写)更新/修复您的答案?我想结束这个问题并接受答案。