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在评论中所写)更新/修复您的答案?我想结束这个问题并接受答案。