EF Fluent API链接表

时间:2014-03-19 12:43:49

标签: entity-framework fluent

这是我的第一篇文章。

我在使用EF 5和FluentAPI时遇到了麻烦。 问题是我使用的链接表通常会导致多对多关系,但我想在我的关系的一边只有一个实体。 我已经设法使用数据库优先工作,但无法使用代码优先使用它。

这是一个基本的实体结构:

public class Person
{
    public virtual int Id {get;set;}
    public virtual string Name {get;set;}
    public virtual Car Car {get;set;}
}

public class Car
{
    public virtual int Id {get;set;}
    public virtual string Name {get;set;}
    public virtual ICollection<Person> Persons = new HashSet<Person>();
}

public class PersonCar
{
    public Person Person {get;set;}
    public Car Car {get;set;}
}

我是从现有数据库创建代码优先的。

数据库具有以下结构:

Person
Id int
Name varchar(200)

Car
Id int
Name varchar(200)

PersonCar
PersonId int, Primary Key
CarId int

如您所见,Person没有Car的外键。有一个用于执行关系的链接表。 无论如何使用Fluent API表达这种关系?

提前致谢

1 个答案:

答案 0 :(得分:0)

首先,您可以从所有非导航属性中删除virtual

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Car> Cars { get; set; }

    public Person()
    {
        Cars = new List<Car>();
    }
}

public class Car
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Person> Persons { get; set; }

    public Car()
    {
        Persons = new List<Person>();
    }
}

然后,您可以通过覆盖上下文中的OnModelCreating来映射它:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>()
            .HasMany(c => c.Cars).WithMany(p => p.Persons)
            .Map(t => t.MapLeftKey("PersonId")
                .MapRightKey("CarId")
                .ToTable("PersonCar"));
    }

修改

基于以下评论,类似这样的内容就足够了:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int CarId { get; set; } 
    // If Car is optional do this: public int? CarId { get; set; }
    public virtual Car Car { get; set; }
}

public class Car
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Person> Persons { get; set; }

    public Car()
    {
        Persons = new List<Person>();
    }
}

您不需要做任何其他事情(无需Fluent API映射)