【问题标题】:EF Core code-first multiple foreign key relationships to same principal entity [duplicate]EF Core代码优先与同一主体实体的多个外键关系[重复]
【发布时间】:2020-10-28 04:13:27
【问题描述】:

我开始使用 EF Core 和数据库优先的方法,我有两个表 CalendarDatesDeals。一笔交易具有多个与日期相关的属性,已为其设置了单独的外键关系。在下面的例子中StartDateEndDate

scaffolded DbContext 显示类定义如下:

    public class CalendarDate
    {
        public CalendarDate()
        {
            DealsStartedOnThatDate = new HashSet<Deal>();
            DealsEndedOnThatDate = new HashSet<Deal>();
        }

        [Key]
        public string Id { get; set; } = string.Empty;
        public DateTimeOffset Date { get; set; }
        public int Year { get; set; }

        public virtual ICollection<Deal> DealsStartedOnThatDate { get; set; }
        public virtual ICollection<Deal> DealsEndedOnThatDate { get; set; }
    }

    public class Deal
    {        
        [Key]
        public string Id { get; set; } = string.Empty;
        public string Name { get; set; } = string.Empty;

        public string StartDateId { get; set; } = string.Empty;
        public virtual CalendarDate StartDate { get; set; } = null!;

        public string EndDateId { get; set; } = string.Empty;
        public virtual CalendarDate EndDate { get; set; } = null!;
    }

我现在想转向代码优先。但是当我添加迁移时,会引发以下错误:

无法确定“ICollection”类型的导航属性“CalendarDate.DealsStartedOnThatDate”表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此属性。

如果我在两个类中注释掉属于EndDate 的字段,它就可以正常工作。所以看来我在这里不能使用多个 MANY:ONE 关系(many=Deals,one=CalendarDates)。尽管从具有现有 FK 约束的现有数据库构建脚手架时它工作得很好。

我在这里错过了什么?

干杯

【问题讨论】:

  • 您在错误消息中有FxDealsTradedHere,而不是在提供的代码中。为什么?
  • 嗨 Roman 感谢您指出这一点。我编辑了帖子。唯一的原因是简单的对象和属性名称(实际值无关紧要,我认为更短的可读性更好)并且我忘记对错误输出进行相同的调整。道歉。
  • 注意异常信息:“手动配置关系”。

标签: c# .net-core entity-framework-core ef-code-first entity-framework-migrations


【解决方案1】:

请尝试像这样在OnModelCreating 中配置关系

modelBuilder.Entity<Deal>().HasOne(cd => cd.StartDate)
            .WithMany(c => c.DealsStartedOnThatDate).HasForeignKey(d => d.StartDateId);

modelBuilder.Entity<Deal>().HasOne(cd => cd.EndDate)
           .WithMany(c => c.DealsEndedOnThatDate).HasForeignKey(d => d.EndDateId);

编辑:检查和修复

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
  • 2013-11-20
  • 1970-01-01
  • 2015-03-26
相关资源
最近更新 更多