在EF Core中存储一对一关系

时间:2018-06-24 02:20:37

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

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

我有一个Location类:

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列,但是我确实需要对其他实体执行此操作,并且我不确定为什么这不起作用

2 个答案:

答案 0 :(得分:3)

您在“位置”类中未定义类型为Int和Identifier和主键的字段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; }

答案 1 :(得分:0)

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