【问题标题】:Entity framework many to one?实体框架多对一?
【发布时间】:2021-09-02 05:33:08
【问题描述】:

我正在尝试创建一个可供任何其他表使用的新表。 表名称将是 Uploads。我将为每个源表记录手动增加 Id 字段。
例如:我将添加一个包含 3 次上传的新预订记录。这 3 个上传将具有相同的 ID。 之后,当我创建一个包含 2 次上传的新场地记录时。我将Uploads.Id增加,然后这2个上传的Id相同。

由于此表将被其他表使用,我不想为每个表创建一个导航器。有什么办法吗?

希望您清楚我的意思。实例模型如下;

    public class Upload
{
    public int Id { get; set; }

    public string Name { get; set; }
}



public class Bookings {

    public int Id {get;set;}
   
    public int? UploadId { get; set; }

    public virtual ICollection<Upload> Uploads { get; set; }
}

public class Venues {

    public int Id {get;set;}
   
    public int? UploadId { get; set; }

    public virtual ICollection<Upload> Uploads { get; set; }
}

【问题讨论】:

  • 预订和场地有什么区别?它们对我来说看起来一样
  • 其实他们有不同的字段。我只是试图缩短它以使其清晰
  • "这 3 个上传的 ID 相同"是什么意思?为什么需要添加 3 个相同的上传?
  • 一条上传记录只有一个父表,或者同一个上传可以在多个表中使用,您没有告诉最重要的吗?
  • 这是一个例子。我的意思是,当我创建一个新的 Venue 时,我将能够上传文件。当我上传 1 个、2 个或更多文件时,它们在 Uploads 表中都将具有相同的 ID。由于 Uploads 表是通用的,我不希望有 VenueId 或 BookingId 列

标签: c# entity-framework asp.net-core entity-framework-core entity-relationship


【解决方案1】:

虽然您可以将 BookingId / VenueId 添加到您的 Upload 表中,但根据此问题的其他答案。

因为 EF Core 仅支持对应于主键/外键的导航。如果您想确保您的 Uploads 不知道它们的用途,您需要引入一个新表来表示 Uploads 的集合。

这还允许您使用标识字段为每个集合自动编号。

public class UploadSet
{
   public int Id { get; set; }
   public virtual ICollection<Upload> Uploads { get; set; }
}
public class Upload
{
   public int Id { get; set; }
   public int SetId { get; set; }
   public string Name { get; set; }
}
public class Bookings 
{
   public int Id {get;set;}
   public int? UploadSetId {get;set;}
   public virtual UploadSet UploadSet { get; set; }
}

请注意,此架构不会阻止您意外地将同一组上传链接到多个父级。

【讨论】:

  • 我考虑过使用备用键来跳过额外的表。但这只有在您只有一个父表时才有效。
  • 谢谢,昨天,我可以通过这样做来修复它
【解决方案2】:

我不想为每个表创建一个导航器。

默认情况下,关系会在在类型上发现导航属性时创建。

我将添加一条包含 3 次上传的新预订记录。这 3 个上传的 ID 相同。

  1. 如果Bookings和Uploads一对多关系,这意味着一个Bookings可以有多个Uploads,那么您应该将您的模型修改为:
    • public class Upload
      {
         public int Id { get; set; }
         public string Name { get; set; }
         public int? BookingId { get; set; }
         public int? VenueId { get; set; }
      }
      public class Bookings 
      {
         public int Id {get;set;}
         public virtual ICollection<Upload> Uploads { get; set; }
      }
      public class Venues 
      {
         public int Id {get;set;}
         public virtual ICollection<Upload> Uploads { get; set; }
      }
      

我建议你click this link查看关系定义了两个实体如何相互关联。

【讨论】:

  • 谢谢,但我暗示我不想在上传表上有导航属性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
相关资源
最近更新 更多