0

Say I have three tables. Settings, Facilities and FacilitySettingOverride in an existing database. The sample data:

Settings table

ID   Name     Value
1    test1    true
2    test2    true

Facilities table

ID    Name
163   Demo1
164   Demo2

FacilitySettingOverride
FacilityId      SettingId   Value
163               2         False
164               1         False
164               2         False

FacilitySettingOverride has two foreign keys---FacilityId and SettingId. Also I want to make a composite key for FacilitySettingOverride.

I just don't know how to make it. My primary code.

[Table("Settings")]
public class Setting
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }

    public FacilitySettingOverride FacilitySettingOverride { get; set; }
}

[Table("Facilities")]
public class Facility
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public  virtual ICollection<FacilitySettingOverride> FacilitySettingOverrides { get; set; }
}

[Table("FacilitySettingOverride")]
public class FacilitySettingOverride
{
    [Key]
    [ForeignKey("FacilityId")]
    public int FacilityId { get; set; }

    public string Value { get; set; }
    [ForeignKey("SettingId")]
    public int SettingId { get; set; }

    public virtual Facility Facility { get; set; }
    public virtual Setting Setting { get; set; }

I guess that it is wrong. Thanks for help.

Undo
  • 25,519
  • 37
  • 106
  • 129

1 Answers1

1

Looking at your data and description, both Settings and Facility have one-to-many associations to FacilitySettingOverride. So Setting shouldn't have a property ...

public FacilitySettingOverride FacilitySettingOverride { get; set; }

... but a collection of FacilitySettingOverrides, just as Facility has.

This should be the proper class model:

[Table("Settings")]
public class Setting
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }    
    public virtual ICollection<FacilitySettingOverride> FacilitySettingOverrides { get; set; }
}

[Table("Facilities")]
public class Facility
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<FacilitySettingOverride> FacilitySettingOverrides { get; set; }
}

[Table("FacilitySettingOverride")]
public class FacilitySettingOverride
{
    [Key, Column(Order = 1)]
    [ForeignKey("Facility")]
    public int FacilityId { get; set; }

    [Key, Column(Order = 2)]
    [ForeignKey("Setting")]
    public int SettingId { get; set; }

    public virtual Facility Facility { get; set; }
    public virtual Setting Setting { get; set; }
    public string Value { get; set; }
}

The combination of KeyAttribute and ColumnAttribute ([Key, Column(Order = 1)]) is used for composite primary keys.

This is the database schema EF creates from it:

enter image description here

Gert Arnold
  • 105,341
  • 31
  • 202
  • 291