ef核心忽略导航属性

时间:2018-05-12 06:48:02

标签: c# entity-framework-core ef-fluent-api ef-core-2.0 navigation-properties

我有一个实体User,其中有两个属性CreatedByUpdatedBy都引用User。默认情况下,EF假定这两者是彼此一对一的关系。我收到以下错误消息:

  

消息:System.InvalidOperationException:无法确定在“User.CreatedBy”和“User.UpdatedBy”之间检测到的一对一关系的子/依赖方。要标识关系的子/依赖方,请配置外键属性。如果这些导航不应该是相同关系的一部分,则在不指定反向的情况下配置它们。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=724062

目前,我有一个这样的课程:

public class User
{

    public int Id { get; set; }

    public int? CreatedById { get; set; }
    public User CreatedBy { get; set; }

    public int? UpdatedById { get; set; }
    public User UpdatedBy { get; set; }

}

基本上,我正在尝试这里:

  • 创建和更新的内容彼此无关(无需导航/反向属性)
  • 任意数量的用户都可以拥有相同的CreatedBy,并且任意数量的用户都可以拥有相同的UpdatedBy

如何让EF忽略导航属性?我CreatedBy的主要原因是我以后可以使用Include(u => u.CreatedBy)。我知道使用IEnumerable<User> AllCreatedUsers属性可以解决这个问题,但我不想为我的实体中的每个创建一个IEnumerable。有没有办法用流畅的API做到这一点?

以下是我的尝试:

modelBuilder.Entity<User>()
                .Property<IEnumerable<User>>("AllCreatedUsers");

modelBuilder.Entity<User>().HasOne(u => u.CreatedBy)
                                .WithMany(u => EF.Property<IEnumerable<User>>(u, "AllCreatedUsers"));

2 个答案:

答案 0 :(得分:4)

您需要使用无参数WithMany方法重载来配置两个Single Navigation Property关系:

modelBuilder.Entity<User>()
    .HasOne(u => u.CreatedBy)
    .WithMany();

modelBuilder.Entity<User>()
    .HasOne(u => u.UpdatedBy)
    .WithMany(); 

答案 1 :(得分:1)

这两个属性的public class User { public int Id { get; set; } public int? CreatedById { get; set; } [ForeignKey("CreatedById")] public User CreatedBy { get; set; } public int? UpdatedById { get; set; } [ForeignKey("UpdatedById")] public User UpdatedBy { get; set; } } 数据注释。

$queue = new Queue(QUEUE_NAME, unserialize(AWS_CREDENTIALS));

// Continuously poll queue for new messages and process them.
while (true) {
    $message = $queue->receive();
    if ($message) {
        try {
            $message->process();
            $queue->delete($message);
        } catch (Exception $e) {
            $queue->release($message);
            echo $e->getMessage();
        }
    } else {
        // Wait 20 seconds if no jobs in queue to minimise requests to AWS API
        sleep(20);
    }
}