【问题标题】:Entity Framework multiple relationships/navigations to entity type实体框架多重关系/导航到实体类型
【发布时间】:2019-09-04 18:04:15
【问题描述】:

我想在 ASP.NET Core 中创建这个数据库架构:

我已经用这段代码试过了,但没有成功。

用户

public class User : IdentityUser 
{
    public override string Id { get; set; }
    public virtual UserVisitors Visitors { get; set; }
}

用户访问者

public class UserVisitors 
{
    public int Id { get; set; }
    public string UserId { get; set; }
    public string UserVisitorId { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime VisitTime { get; set; }

    [ForeignKey("UserId")]
    public virtual User User { get; set; }

    [ForeignKey("UserVisitorId")]
    public virtual User UserVisitor { get; set; }
}

我在迁移时遇到此错误:

无法确定“UserVisitor”类型的导航属性 >“User.Visitors”表示的关系。手动配置 >relationship,或使用“[NotMapped]”属性忽略此属性,或 >通过在“OnModelCreating”中使用“EntityTypeBuilder.Ignore”。

我希望有人可以帮助我。提前致谢。

更新:

UserVisitors 更改为:

public class UserVisitors 
{
    public int Id { get; set; }
    [InverseProperty("User")]
    public string UserId { get; set; }

    [InverseProperty("User")]
    public string UserVisitorId { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime VisitTime { get; set; }

    public virtual User User { get; set; }
}

我现在可以编译它,但是在数据库上是错误的。 数据库图像:

UserVisitorId 列与User.UserID 没有关系。

【问题讨论】:

标签: c# asp.net-core entity-framework-core


【解决方案1】:
public class User : IdentityUser 
{

    public override string Id { get; set; }

    public virtual ICollection<UserVisitor> UserVisitors { get; set; }
    public virtual ICollection<UserVisitor> UserVisitors2 { get; set; }
}

public class UserVisitor 
{

    public int Id { get; set; }

    [InverseProperty("User")]
    public string UserId { get; set; }

    public virtual User User {get; set;}
    public virtual User UserVisitor  {get; set;}

    [InverseProperty("User")]
    public string UserVisitorId { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime VisitTime { get; set; }

    public virtual User User { get; set; }
  }

然后您需要使用OnModelCreatig 进行正确的映射,如下所示:

modelBuilder.Entity<UserVisitor>()
    .HasOne(x => x.UserVisitor)
    .WithMany(x => x.UserVisitors)

modelBuilder.Entity<UserVisitor>()
    .HasOne(x => x.User)
    .WithMany(x => x.UserVisitors2)

【讨论】:

  • 你不需要在两个地方指定相同的配置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 2011-12-17
  • 1970-01-01
相关资源
最近更新 更多