Итак, вот как я в конечном итоге реализовал свою службу odata.Сначала мне пришлось переделать данные, исключив таблицу нормализации GroupUser и определив соответствующую коллекцию для самих объектов:
[DataServiceKey("Id")]
public class Group
{
public Guid Id { get; set; }
public string GroupTag { get; set; }
public DateTime DateCreated { get; set; }
[ForeignKey("GroupOwner")]
public Guid? GroupOwnerId { get; set; }
public virtual Person GroupOwner { get; set; }
public bool IsActive { get; set; }
//his represents the many-to-many relationship
public virtual ICollection<User> GroupMembers { get; set; }
}
[DataServiceKey("Id")]
public class User
{
public Guid Id { get; set; }
public string Username { get; set; }
public string Password { get; set; }
//This represents the many-to-many relationship
public virtual ICollection<Group> MembersOfGroups { get; set; }
//This represents the 'GroupOwner' ForeignKey relationship
public virtual ICollection<Group> MyGroups { get; set; }
}
В классе datacontext я затем переопределил метод OnModelCreating следующим образом
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().HasMany(p => p.MemberOfGroups).
WithMany(c => c.GroupMembers)
.Map(t=>t.MapLeftKey("GroupId")
.MapRightKey("UserId")
.ToTable("GroupUsers"));
}
Это в основном дает сущностной структуре некоторое представление о том, как я хочу, чтобы моя модель была определена, таким образом переопределяя традиционную реализацию.На мой взгляд, самый простой способ понять вышеприведенное утверждение - это прочитать его как следующее:
Сущность User может иметь много (имеет много) MemberOfGroups, каждая из которых может существовать «со многими» GroupMembers (следовательно, отношение «многие ко многим»), поле внешнего ключа для левой таблицы (Group) должно называться GroupId, а для правой таблицы (User) должно называться UserId, и они должны отображаться в таблице с именем «GroupUsers».
Если вы посмотрите на таблицы данных, сгенерированные структурой сущностей, вы найдете третью таблицу под названием GroupUsers с двумя столбцами: UserId и GroupId как объединенный первичный ключ, и каждая ссылается на отношение внешнего ключа с соответствующей таблицей сущностей.
При этом вы можете легко запросить службу оддаты, как если бы обе коллекции были отношениями один-ко-многим соответствующей родительской сущности.Надеюсь, это кому-нибудь поможет.