Опять же с устаревшей базой данных, которую нельзя изменить, и с использованием 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
}