微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何定义应使用哪个外键导航属性?

我有两个模型课

注册

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;
    }
}

ApplicationUser

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:'无效的列名 “ ApplicationUserId”。

我认为这是因为EF由于具有Registration.ApplicationUserId导航属性,因此EF试图在认情况下在数据库中找到ApplicationUser列。但是属性(和sql列)被命名为AspNetUsersId,而不是ApplicationUserId。如何在模型构建器(dbContext)中覆盖此命名?

我尝试过类似的事情

modelBuilder.Entity<Registration>(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);

https://docs.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api%2Cfluent-api-simple-key%2Csimple-key#single-navigation-property-1

https://entityframeworkcore.com/model-relationships

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。