entity framework关系

我有这三个实体:

public class Dog { public int DogId { get; set; } public string Name { get; set; } public int Age { get; set; } public bool Checked { get; set; } public string DogImage { get; set; } public virtual ICollection Results { get; set; } } public class Event { public int EventId { get; set; } public string EventName { get; set; } public string EventLocation { get; set; } public string EventType { get; set; } public string EventDate { get; set; } public virtual ICollection Results { get; set; } } public class Result { public int ResultId { get; set; } public int Track { get; set; } public int Obedience { get; set; } public int Protection { get; set; } [ForeignKey("Dog")] public int DogId { get; set; } public virtual Dog Dog { get; set; } [ForeignKey("Event")] public int EventId { get; set; } public virtual Event Event { get; set; } } 

我之前一直在这里得到帮助,以便像这样设置它。 尝试创建多对多关系时entity framework错误

所以现在的方式我猜测result是将这些类包含外键的“胶水”连接到另外两个表。

我几天来一直试图实现的目标是:

  1. 创建一个事件。
  2. 添加狗参加活动。
  3. 将结果添加到参与choosenEvent的狗。

让我们说我创建一个这样的事件:

 [HttpPost] public ActionResult CreateEvent(Event newEvent) { newEvent.EventDate = newEvent.EventDate.ToString(); _ef.AddEvent(newEvent); return View(); } 

现在我想下一步是为这个事件添加一个狗列表,为了做到这一点,我需要以某种方式使用我的结果类,因为那是“胶水”类。 如果我在这里的正确轨道,请告诉我。

像你做的那样做很多很多关系并不是一个好主意。 看这里

为了获得适当的多对多关系,在数据库中以正确的方式映射,没有陷阱,我会这样尝试:

 public class Dog {} public class Event {} public class Result {} // This is a linking table between Dog and Results public class DogResult { public int Id {get;set;} public int DogId {get;set;} public int ResultId {get;set;} } // This is a linking table between Events and Results public class EventResult { public int Id {get;set;} public int EventId {get;set;} public int ResultId {get;set;} } 

当您现在编写查询时,您可以这样做:

 using (var context = new DbContext()) { var dogs = context.Dogs(); var dogResults = context.DogResults(); var results = context.Results(); var dogsAndResults = dogs.Join( dogResults, d => d.Id, r => r.DogId, (dog, dogResult) => new { dog, dogResult }) .Join( results, a => a.dogResult.ResultId, r => r.Id, (anon, result) => new { anon.dog, result }); } 

它看起来有点讨厌,但它会返回一个包含Dog及其相关Result的匿名对象列表。 但显然最好在存储过程中执行此操作:

 using (var context = new DbContext()) { var results = context.Database.ExecuteStoreQuery("SELECT * .... JOIN ... "); } 

这更干净,因为您使用的是SQL。

这是一种处理它的更复杂的方法。 但性能要高得多,特别是如果你完全理解entity framework如何执行LINQ。

显然,如果你想创建这些链接:

 using (var context = new DbContext()) { context.Dogs.AddRange(dogs); // dogs being a list of dog entities context.Results.AddRange(results); // events being a list of results entities context.DogResults.AddRange(dogResults); // a list of the links } 

完全取决于您如何创建这些链接。 要将其转换为sproc,您还需要创建一些自定义的用户定义表类型,并将它们用作表值参数。

 var dogResults = dogs.SelectMany( d => results.Select ( r => new DogResult { DogId = d.Id, ResultId = r.Id } ) ); 

这是一个LINQ查询的野兽,基本上它得到每只狗并将其链接到每个结果。 在LinqPad中运行它并转储值。

我只是用流利的方法做到这一点(当我在学习的时候,我发现你可以用流利的方式做所有事情,但不能用注释做,所以我没有看过它们),下面在我的Unit实体之间创建了多对多和我的UnitService实体:

 modelBuilder.Entity() .HasMany(u => u.Services) .WithMany(us => us.Units); 

此代码位于protected override void OnModelCreating(DbModelBuilder modelBuilder)方法中。

在你的情况下, EventUnitDogUnitService

哦ooops,你根本不需要那个,你的’join’表是你的结果表,在我的情况下我不关心连接表所以它全部隐藏。 也许是这样的:

  modelBuilder.Entity() .HasMany(e => e.Results); modelBuilder.Entity() .HasMany(d => d.Results);