【问题标题】:Storing One-To-One relationships in EF Core在 EF Core 中存储一对一关系
【发布时间】:2018-12-03 00:36:40
【问题描述】:

我正在尝试将两个实体保存到相互关联的数据库中,但其中一个实体从不保存另一个实体的 ID。

我有一个位置类:

public string Name { get; set; }
public string Description { get; set; }
public string Latitude { get; set; }
public string Longitude { get; set; }
public Company Company { get; set; }

[ForeignKey("OpeningTimeId")]
public OpeningTime OpeningTimes { get; set; }

我有一个 OpeningTimes 课程:

public string Monday { get; set; }
public string Tuesday { get; set; }
public string Wednesday { get; set; }
public string Thursday { get; set; }
public string Friday { get; set; }
public string Saturday { get; set; }
public string Sunday { get; set; }

[ForeignKey("LocationId")]
public Location Location { get; set; }

然后我尝试将这些保存到数据库中:

Location location = new Location()
{
    Name = LocationDto.Name,
    Description = LocationDto.Description,
    Latitude = LocationDto.Latitude,
    Longitude = LocationDto.Longitude,
    Company = LocationDto.Company,
    OpeningTimes = new OpeningTime() {
        Monday = LocationDto.OpeningTimes.Monday,
        Tuesday = LocationDto.OpeningTimes.Tuesday,
        Wednesday = LocationDto.OpeningTimes.Wednesday,
        Thursday = LocationDto.OpeningTimes.Thursday,
        Friday = LocationDto.OpeningTimes.Friday,
        Saturday = LocationDto.OpeningTimes.Saturday,
        Sunday = LocationDto.OpeningTimes.Sunday,
    }
};

_context.Locations.Add(location);
_context.SaveChanges();

当它被保存到数据库时,Locations 表中的 OpeningTimeId 列被填充,但 OpeningTimes 表中的 LocationId 列未被填充。

现在在这个特定示例中,我不一定需要填充 LocationId 列,但我确实需要为其他实体执行此操作,我不确定为什么这不起作用.

【问题讨论】:

  • 在两个表中都有一个 FK 相互引用,这有点不寻常。如果我没看错,你想要的是 Locations 有 OpeningTimes。这意味着每个OpeningTime 都会有一个LocationId。但是 Locations 不会有 OpeningTimeId。相反,要查找属于某个位置的 OpeningTimes,您只需执行 location.OpeningTimes。在引擎盖下,数据库将“SELECT FROM OpeningTimes WHERE LocationId =
  • 对,好吧,有道理。所以我现在的工作有点倒退。所以我会从 OpeningTimes 类中删除 public Location Location { get; set; } 属性。?还是反过来?
  • 对,您可以将 Location 公共成员从 OpeningTimes 课程中移除。这是一篇类似的文章:weblogs.asp.net/manavi/…
  • 酷,谢谢。这是有道理的,而且有效。尽管它与您的原始描述相反。这使我的 Locations 表带有一个 OpeningTimesId 列。但这对我来说很好。

标签: c# .net-core entity-framework-core ef-core-2.0


【解决方案1】:

您在位置类中没有定义类型为 Int 的字段 ID 和标识符和主键,一旦记录添加到表中就会自动添加一个单元。 但是你可以在表中的数据库中作为向导来做这件事,但是你需要重新添加到课堂中,但是如果你想在类本身中添加属性,编译器会在后台这样做。

喜欢:

  [Key]
  public int LocationId {get;set;}
  public string Name { get; set; }
  public string Description { get; set; }
  public string Latitude { get; set; }
  public string Longitude { get; set; }
  public Company Company { get; set; }

  [ForeignKey("OpeningTimeId")]
  public OpeningTime OpeningTimes { get; set; }

【讨论】:

  • 我忽略了我的类继承自另一个包含主键的类。问题是我引用了每个对象中的对象,从而导致了引用循环。 - 我认为我仍然需要对此进行调整,因为我的删除不是级联的,我认为这是因为我在 Locations 中引用了 OpeningTimes,而不是相反。
【解决方案2】:

不需要在两个表中都有引用,从一个表中删除。对于一对一映射,您可以向表中的引用外键列添加唯一约束。

【讨论】:

    猜你喜欢
    • 2021-07-21
    • 2019-07-25
    • 2017-10-26
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多