C# 具有两个AppUser引用的代码优先迁移建模类

C# 具有两个AppUser引用的代码优先迁移建模类,c#,annotations,ef-code-first,C#,Annotations,Ef Code First,我正在尝试使用代码优先迁移为用户的私有消息建模一个消息类 public class Message { public int MessageId { get; set; } [Required] public string MessageForUserId { get; set; } public virtual ApplicationUser MessageForUser { get; set; } [Required] public st

我正在尝试使用代码优先迁移为用户的私有消息建模一个消息类

public class Message
{
     public int MessageId { get; set; }

    [Required]
    public string MessageForUserId { get; set; }
    public virtual ApplicationUser MessageForUser { get; set; }

    [Required]
    public string MessageFromUserId { get; set; }

    public virtual ApplicationUser MessageFromUser { get; set; }

    [Required]
    public string MessageContent { get; set; }

    public bool MessageRead { get; set; }

    [Required]
    public DateTime MessageCreatedOn { get; set; }

    public DateTime? MessageReadOn { get; set; }
}
在ApplicationUser类中,我添加了两个集合

public class ApplicationUser : IdentityUser
{
    // other properties removed for brevity
    public ICollection<Message> UserMessages { get; set; }
    public ICollection<Message> SentMessages { get; set; }
}
我得到的错误与上面提到的相同,即使生成器选项有意义。实体有一种类型的ApplicationUser,MessagesFromUser,可以有多种类型,并且foreignkey id是正确的。其他属性也是如此。

builder.Entity()
builder.Entity<Message>()
    .HasOne(x => x.MessageForUser)
    .WithMany(x => x.UserMessages)
    .HasForeignKey(x => x.MessageForUserId)
    .OnDelete(DeleteBehavior.Cascade);

builder.Entity<Message>()
    .HasOne(x => x.MessageFromUser)
    .WithMany(x => x.SentMessages)
    .HasForeignKey(x => x.MessageFromUserId)
    .OnDelete(DeleteBehavior.Cascade);
.HasOne(x=>x.MessageForUser) .WithMany(x=>x.UserMessages) .HasForeignKey(x=>x.MessageForUserId) .OnDelete(DeleteBehavior.Cascade); builder.Entity() .HasOne(x=>x.MessageFromUser) .WithMany(x=>x.sent消息) .HasForeignKey(x=>x.MessageFromUserId) .OnDelete(DeleteBehavior.Cascade);
可能与@Dominik Szymanski重复。。。那篇文章在我的搜索中没有出现,谢谢你的推荐。这看起来是正确的解决方案。我正在使用.NETCore2.0和EFCore2。实体生成器中的HasRequired似乎已被弃用。我是否错过了一个图书馆参考资料,或者是另一种定义它的方式。Resharper没有向我显示HasRequired的有效库。请看一下:这不是你要问的问题,但有你需要的解决方案和你潜在问题的解决方案。@Dominik Szymanski。。。这篇文章也很有帮助,而且非常相似。我相应地调整了我的代码,请参阅文章中的更新,但我得到了相同的错误。我使其正常工作,需要将Icollection实体添加到WithMany调用中,即builder.Entity(typeof(Message)).HasOne(typeof(ApplicationUser),“MessageFromUser”).WithMany(“SentMessages”).HasForeignKey(“MessageFromUserId”).OnDelete(DeleteBehavior.Restrict);@ceferrari…我们已经有了解决方案,如上所述,我已经在使用lambda表单,我们投票支持您。
 builder.Entity(typeof(Message))
            .HasOne(typeof(ApplicationUser), "MessageFromUser")
            .WithMany()
            .HasForeignKey("MessageFromUserId")
            .OnDelete(DeleteBehavior.Restrict); // no ON DELETE

 builder.Entity(typeof(Message))
            .HasOne(typeof(ApplicationUser), "MessageForUser")
            .WithMany()
            .HasForeignKey("MessageForUserId")
            .OnDelete(DeleteBehavior.Cascade); // set ON DELETE CASCADE
builder.Entity<Message>()
    .HasOne(x => x.MessageForUser)
    .WithMany(x => x.UserMessages)
    .HasForeignKey(x => x.MessageForUserId)
    .OnDelete(DeleteBehavior.Cascade);

builder.Entity<Message>()
    .HasOne(x => x.MessageFromUser)
    .WithMany(x => x.SentMessages)
    .HasForeignKey(x => x.MessageFromUserId)
    .OnDelete(DeleteBehavior.Cascade);