代表实体框架中的连接表

时间:2018-05-24 16:17:54

标签: c# entity-framework ef-code-first many-to-many junction-table

我正在创建一个适用以下逻辑的模式:

  • String可以属于多个位置。
  • 多个Locations可以有多个String,或者没有 String
  • 必须记录形成DateTimeDateScraped之间关系的Location(作为String)。

基本上,我已经使用像这样的联结表将关系映射为多对多关系:

sqldbm

在Code First EF6(使用SQLite)中映射图表时,我有以下对象:

public class Location
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long LocationId { get; set; }

    [Required]
    public string Country { get; set; }

    [Required]
    public string CityOrProvince { get; set; }

    [Required]
    public string PlaceOrCity { get; set; }

    [Required]
    public string PostalCode { get; set; }
}

public class String
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long StringId { get; set; }

    [Required]
    public string SearchString { get; set; }
}

public class LocationStringMapping
{
    [Required]
    public string LocationId { get; set; }

    [Required]
    public string StringId { get; set; }

    [Required]
    public DateTime DateScraped { get; set; }
}

我基于猜想到目前为止所做的事情,因为我似乎无法找到关于如何建立这样的关系的具体信息。通常我会使用联结表,但这是在vanilla SQL中。 EF中的实现是否有所不同?

我是否需要手动管理LocationStringMapping表,或者是否存在某种我不知道的隐式关系模型?

1 个答案:

答案 0 :(得分:2)

public class Location
{
    public long LocationId {get;set;}
    public virtual ICollection<LocationStringMapping> LocationStringMappings {get;set;}
    //other
}

public class String
{
    public long StringId {get;set;}
    public virtual ICollection<LocationStringMapping> LocationStringMappings {get;set;}
    //other
}

public class LocationStringMapping
{
    [Key, Column(Order = 0)]
    public long LocationId { get; set; }
    [Key, Column(Order = 1)]
    public long StringId { get; set; }

    public virtual Location Location {get;set;}
    public virtual String String {get;set;}

    public DateTime DateScraped {get;set;}
}