Один ко многим с таблицей соединения и необязательным отношением в Entity Framework 4.1 Fluent API

Опять же с устаревшей базой данных, которую нельзя изменить, и с использованием Entity Framework 4.1 с Fluent API только для чтения данных.

public class Client
{
  [Key]
  public int ClientID { get; set; }
  public string Name { get; set ;}

  public virtual ICollection<Phone> Phones { get; set; }
}

public class Phone
{
  [Key]
  public int PhoneID { get; set; }
  public string Number { get; set; }

  public virtual Client Client { get; set; }
}

public class ClientPhone
{
  [Key]
  [Column(Order=0)]
  public int ClientID { get; set; }

  [Key]
  [Column(Order=1)]
  public int PhoneID { get; set; }
}

Я хочу, чтобы у Клиента было много телефонов, но у телефонов должен быть только необязательный клиент. Примечание: в телефонах должно быть только 0 | 1 клиент. Я НЕ хочу "много ко многим". Итак, я пробовал следующее:

modelBuilder.Entity<Client>()
  .HasMany(c => c.Phones)
  .WithOptional(p => p.Client)
  .Map(m =>
    {
      m.MapKey("ClientID");
      m.ToTable("ClientPhone");
    });

modelBuilder.Entity<Phone>()
  .HasOptional(p => p.Client)
  .WithMany(c => c.Phones)
  .Map(m =>
    {
      m.MapKey("PhoneID");
      m.ToTable("ClientPhone");
    });

Я пробовал пару перестановок, обычно получаю сообщение об ошибке «Каждое имя свойства в типе должно быть уникальным».

Спасибо за помощь.

РЕДАКТИРОВАТЬ С ОТВЕТОМ

Вот изменения, которые я внес в классы сущностей. Можно перейти от одного клиента к нескольким телефонам и с одного телефона к одному клиенту , но вы должны пройти через таблицу соединений ClientPhone.

[Table("Client")]
public class Client
{
  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int ClientID { get; set; }

  public string Name { get; set ;}

  public virtual ICollection<Phone> Phones { get; set; } // Client has * Phones
}

[Table("Phone")]
public class Phone
{
  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int PhoneID { get; set; }

  public string Number { get; set; }

  public virtual Client Client { get; set; } // Phone has 0|1 Client
}

[Table("ClientPhone")]
public class ClientPhone
{
  // Removed the Key attribute
  public int ClientID { get; set; }

  [Key] // Left the Key on the 0|1 side
  [ForeignKey("Phone")]
  public int PhoneID { get; set; }

  public virtual Client Client { get; set; } // One Client
  public virtual Phone Phone { get; set; } // One Phone
}
5
задан GoClimbColorado 12 August 2011 в 16:44
поделиться