如何在EF4代码的同一个表/类中使用多个FK

时间:2011-02-24 08:16:48

标签: entity-framework entity-framework-4 code-first entity-framework-ctp5 ef-code-first

我有这两张桌子:

create table countries
(
int id identity primary key,
name nvarchar(20)
)

create table persons
(
int id identity primary key,
country1 int references countries(id),
country2 int references countries(id),
country3 int references countries(id)
)

我应该如何创建我的类和映射,以便将它们正确映射到这些表? (我使用EF4 CTP5 Code First)

1 个答案:

答案 0 :(得分:2)

暂时忽略对多个国家/地区实体的非规范化引用,您可以编写以下内容:

public class Country
{
    [Key]
    public int CountryID { get; set; }

    [MaxLength(20)]
    public string Name { get; set; }
}

public class Person
{
    public int PersonID { get; set; }

    [MaxLength(20)]
    public string Name { get; set; }

    public Country Country1 { get; set; }
    public Country Country2 { get; set; }
    public Country Country3 { get; set; }
}

当然,您还需要DbContext:

public class Context : DbContext
{
    public DbSet<Person> People { get; set; }
    public DbSet<Country> Countries { get; set; }

    public Context(string dbName)
        :base (dbName)
    {
    }
}

这将导致表模式镜像您的原始需求。

但请注意,如果您声明这样的类:

public class Country
{
    [Key]
    public int CountryID { get; set; }

    [MaxLength(20)]
    public string Name { get; set; }

    public ICollection<Person> People { get; set; }
}

public class Person
{
    public int PersonID { get; set; }

    [MaxLength(20)]
    public string Name { get; set; }

    public ICollection<Country> Countries { get; set; }
}

在这种情况下,EF将创建一个多对多联接表,允许您将任意数量的国家/地区与任意数量的人相关联:

CREATE TABLE [CountryPersons] 
(
    [CountryCountryID] int NOT NULL,
    [PersonPersonID] int NOT NULL
);

请注意,由于收集了国家/地区的人员和人群中的国家/地区,EF会推断出多对多关系。

HTH。