这是我的第一篇文章。
我在使用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表达这种关系?
提前致谢
答案 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映射)