简体   繁体   English

实体框架多个关系/导航到实体类型

[英]Entity Framework multiple relationships/navigations to entity type

I want to create this database schema in ASP.NET Core: 我想在ASP.NET Core中创建此数据库架构:

I already tried it with this code without success. 我已经用此代码尝试过了,但没有成功。

User 用户

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

UserVisitors UserVisitors

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

I'm getting this error on the migrations: 我在迁移时遇到此错误:

Unable to determine the relationship represented by navigation property >'User.Visitors' of type 'UserVisitors'. 无法确定类型为“ UserVisitors”的导航属性>“ User.Visitors”所表示的关系。 Either manually configure the >relationship, or ignore this property using the '[NotMapped]' attribute or >by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'. 手动配置>关系,或使用'[NotMapped]'属性或> OnModelCreating中的'EntityTypeBuilder.Ignore'忽略此属性。

I hope someone can help me. 我希望有一个人可以帮助我。 Thanks in advance. 提前致谢。

Update: 更新:

Changed UserVisitors to: 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; }
}

I can compile it now, but on the database is it wrong. 我现在可以编译它,但是在数据库上是错误的。 Database image: 数据库映像:

The column UserVisitorId doesn't have a relationship to User.UserID . UserVisitorId不必关系User.UserID

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

Then you need to make proper mappings using OnModelCreatig as follows: 然后,您需要使用OnModelCreatig进行正确的映射,如下所示:

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM