假设我们正在使用 Entity Framework 代码优先方法,并且我们有两个对象,它们通过两个一对多关系链接(一个 Person
可以拥有多个 Car
,但每辆车都有一个车主和一个“主要司机”)。这是两个实体:
public class Person {
#region Persisted fields
[Required]
public int PersonId { get; set; }
[Required]
public string FirstName { get; set; }
[Required]
public string Surname { get; set; }
#endregion
#region Navigation properties
public virtual ICollection<Car> CarsOwned { get; set; }
#endregion
}
public class Car {
#region Persisted fields
[Required]
public int CarId { get; set; }
[Required]
public string Make { get; set; }
[Required]
public string Manufacturer { get; set; }
[Required]
public string RegNo { get; set; }
[Required]
[ForeignKey("Owner")]
public int OwnerId { get; set; }
[Required]
[ForeignKey("MainDriver")]
public int MainDriverId { get; set; }
#endregion
#region Navigation properties
public virtual Person Owner { get; set; }
public virtual Person MainDriver { get; set; }
#endregion
}
我如何告诉 Entity Framework 应该使用两个外键(OwnerId
或 MainDriverId
)中的哪一个来确定 CarsOwned
集合?我只是尝试用这两个实体自动创建一个数据库,它假设我出于某种原因想使用 MainDriverId
作为 CarsOwned
外键,而显然我想使用 OwnerId
外键。
最佳答案
我怀疑您必须使用流畅的配置来进行设置。
public class YourContext : DbContext
{
...
protected override OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Car>()
.HasRequired(c => c.Owner)
.WithMany(p => p.CarsOwned)
.HasForeignKey(c => c.OwnerId)
.WillCascadeOnDelete(false);
// Otherwise you might get a "cascade causes cycles" error
modelBuilder.Entity<Car>()
.HasRequired(c => c.MainDriver)
.WithMany() // No reverse navigation property
.HasForeignKey(c => c.MainDriverId)
.WillCascadeOnDelete(false);
}
}
关于c# - 如何在 Entity Framework 中设置两个一对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13311461/