2016-05-20 2 views
1

У меня есть отношение «Много ко многим» с некоторыми дополнительными полями. Но поскольку есть фотографии, добавленные ко многим отношениям, которые могут относиться к другим отношениям, я хотел отделить его, чтобы я мог изменить его, просто изменив отношение «Один ко многим». Это модельДобавить соединение «один ко многим» для многих-ко-многим

public class Segment 
{ 
    public int SegmentId { get; set; } 
    public int ConnectionPointIdEnd { get; set; } 
    public string ConnectionName { get; set; } 
    public string ConnectionInformation { get; set; } 
    public string Image { get; set; } 
    public string Direction { get; set; } 
    public ICollection<ConnectionPointRoute> ConnectionPointRoutes { get; set; } 
} 
public class ConnectionPointRoute 
{ 
    public int ConnectionPointId { get; set; } 
    public int RouteId { get; set; } 
    public int SegmentId { get; set; } 
    public int Position { get; set; } 
    public ConnectionPoint ConnectionPoint { get; set; } 
    public Route Route { get; set; } 
    public Segment Segment { get; set; } 
} 

И ModelBuilder выглядит следующим образом:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<ConnectionPointRoute>() 
      .HasKey(c => new { c.ConnectionPointId, c.RouteId, c.SegmentId }); 

     modelBuilder.Entity<ConnectionPoint>() 
      .HasMany(c => c.ConnectionPointRoutes) 
      .WithRequired(x => x.ConnectionPoint) 
      .HasForeignKey(c => c.ConnectionPointId); 

     modelBuilder.Entity<Route>() 
      .HasMany(c => c.ConnectionPointRoutes) 
      .WithRequired(x => x.Route) 
      .HasForeignKey(c => c.RouteId); 

     modelBuilder.Entity<Segment>() 
      .HasMany(c => c.ConnectionPointRoutes) 
      .WithRequired(x => x.Segment) 
      .HasForeignKey(c => c.SegmentId); 
    } 

И все это хорошо работает для получения предметов, но по какой-то причине она не позволит мне оставить новый маршрут например, это вызывает у меня ошибку:

"Multiplicity constraint violated. The role 'Segment_ConnectionPointRoutes_Source' of the relationship 'InBuildingNavigator.Data.Models.Segment_ConnectionPointRoutes' has multiplicity 1 or 0..1."

Любые мысли?

ответ

0

Исправлено это! У меня была ошибка в моем почтовом коде, я добавил полные дочерние объекты, которые не имеют большого смысла в моем случае.

Спросите меня, хотите ли вы более подробное исправление!

0

всего две вещи более к этому:

  1. Я бы рекомендовал вам использовать дополнительный объект для многих-ко-многим (если не уже делают это). Это даст вам больше контроля над именем таблицы и выборами, которые вы можете захотеть сделать.
  2. используйте виртуальное ключевое слово для ваших свойств, которое вам не нужно напрямую (для ваших коллекций) - это позволит ef реализовать ленивую загрузку на них.
+0

Я решил использовать явную загрузку, так как хочу иметь тесный контроль над данными. Должен сказать, что я не могу следовать твоему первому предложению, объяснять? –

+0

Это из моего собственного опыта. Например: у меня было отношение друзей - классическое отношение «многие ко многим». Это отношение имеет другое свойство, которое является friendStatus (подтверждается дружбой). Когда я хотел получить всех подтвержденных друзей, это, как правило, было трудно при работе с идентификатором asp.net. Не поймите меня неправильно, автоматический способ сделать много-ко-многим работает хорошо, я просто испытал, что его сложно настроить позже. – Nils

Смежные вопросы