实体框架 6 代码优先与 Fluent API 的关系



我在现有数据库中有 3 个相关表。 多对多(多人多组)和表之间的 - 事件,女巫拉动这两个表。

public class Person
{
public int PersonID { get; set; }
public string No { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<Event> Events { get; set; }
}
public class Event
{
public int EventID { get; set; }
public string EventData { get; set; }
public int PersonID { get; set; }
public int GroupID { get; set; }
public virtual Person Person { get; set; }
public virtual Group Group { get; set; }
}
public class Group
{
public int GroupID { get; set; }
public string GroupName { get; set; }
public virtual ICollection<Event> PersonGroup { get; set; }
}

我使用 Fluent API 描述了关系。 首先我宣布PK的

modelBuilder.Entity<Person>()
.HasKey(k => k.PersonID });
modelBuilder.Entity<Event>()
.HasKey(k => k.EventID);
modelBuilder.Entity<Group>()
.HasKey(k => k.GroupID });

现在外键: 人有很多事件

modelBuilder.Entity<Person>()
.HasKey(k => k.PersonID })
.HasMany(k => k.Events)
.WithRequired()
.HasForeignKey(f => f.PersonID);

在事件类中,我有 Person(及其所有参数)

modelBuilder.Entity<Event>()
.HasRequired(s => s.Person)
.WithMany()
.HasForeignKey(fk => fk.PersonID);

我还需要一个包含所有数据的组:

modelBuilder.Entity<Event>()
.HasOptional(s => s.Group)
.WithMany()
.HasForeignKey(fk => fk.GroupID });

至少我需要一个参加活动的个人组

modelBuilder.Entity<Group>()
.HasKey(k =>k.GroupID })
.HasMany(k => k.PersonGroup)
.WithOptional()
.HasForeignKey(fk => fk.GroupID);

看来我有我需要的一切,但我需要一个 mo 集合(一群人的名字)

我通过人员组关系得到什么,我有所有事件,但也需要得到人。你能帮忙吗?

Edit

我只是意识到这不是典型的多对多,因为您的事件组关系是可选的。这是有意的吗?

也许应该更改模型以反映更自然的事件结构:

群人:多对多

事件组:多对多

事件-人物:没有直接关系,只能通过组;替代多对多

按照模型当前设计的方式,单个事件条目不能与多个组相关,一个人和一个人不能是组的一部分,除非他们在事件条目的上下文中关联。

基本上,您

请求的东西不能直接可用,因为您决定显式创建具有其他属性的多对多表。

但是,在查询中,您始终可以编写一个选择来获取人员集合

db.Groups.Select(g => new {Group = g, PeopleInGroup = g.PersonGroup.Select(ev => ev.Person)})

关于您的模型的一些旁注:

  • 考虑删除EventID,改用modelBuilder.Entity<Event>().HasKey(k => new { k.PersonID, k.GroupID }),就像设计典型的多对多表一样。
  • 在流畅的 API 中提及反向属性:

.

modelBuilder.Entity<Person>()
.HasKey(k => k.PersonID })
.HasMany(k => k.Events)
.WithRequired(e => e.Person)
.HasForeignKey(f => f.PersonID);
// redundant with the previous configuration
modelBuilder.Entity<Event>()
.HasRequired(s => s.Person)
.WithMany(p => p.Events)
.HasForeignKey(fk => fk.PersonID);
// same to be done for groups

为了方便地访问组中的关联人员,您可以创建一个未映射的属性 getter 来包装必要的查询:

public class Group
{
public int GroupID { get; set; }
public string GroupName { get; set; }
public virtual ICollection<Event> PersonGroup { get; set; }
[NotMapped]
public IEnumerable<Person> PersonsInGroupEvents
{
return PersonGroup.Select(ev => ev.Person);
}
}
// or fluent api way of NotMapped:
modelBuilder.Entity<Group>()
.Ignore(x => x.PersonsInGroupEvents);

相关内容

  • 没有找到相关文章

最新更新