2015-12-30 3 views
1

Я пытаюсь создать 1: много отношений между Person и Car. Я знаю, что это тривиально. Но при переходе к Enable-Migrations в менеджере пакетов консоли я получаю это:Ошибка при выполнении Enable-Migrations в Entity Framework Code Сначала

Car_Person_Target_Car_Person_Source:: Типы всех свойств в зависимая роль реляционного ограничения должны быть такими же, как и соответствующие типы недвижимости в Принципала Роль. Тип property 'PersonID' для лица 'Car' не соответствует типу Свойство 'FirstName' для лица 'Person' в ссылочном ограничении 'Car_Person'.

Car_Person_Target_Car_Person_Source:: Типы всех свойств в зависимой роли реляционного ограничения должны быть то же самое, что и соответствующие типы недвижимости в основную роль. Тип свойства «PersonSsn» на объекте «Автомобиль» не соответствует типу типа «LastName» на объекте «Лицо» по ссылке ограничение «Car_Person».

лицо Класс:

public class Person 
{ 
    public Person() 
    { 
     Cars = new List<Car>(); 
    } 
     [Key, Column(Order = 0)] 
     public int ID { get; set; } 
     [Key, Column(Order = 1)] 
     public int Ssn { get; set; } 
     public int Age { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 

     public virtual ICollection<Car> Cars { get; set; } 
} 

Класс автомобиля:

public class Car 
{   
    [Key, Column(Order = 0)] 
    public int ID { get; set; } 
    [Key, Column(Order = 1)] 
    public int ChassisSerial { get; set; } 

    [ForeignKey("Person"), Column(Order = 0)] 
    public int? PersonID { get; set; } 
    [ForeignKey("Person"), Column(Order = 1)] 
    public int? PersonSsn { get; set; } 

    public virtual Person Person { get; set; } 
} 

Спасибо заранее.

ответ

1

Изменение типа внешних ключей к «ИНТ», они должны совпадать с типом ПК Person в

public class Car 
{   
    [Key, Column(Order = 0)] 
    public int ID { get; set; } 
    [Key, Column(Order = 1)] 
    public int ChassisSerial { get; set; } 

    [ForeignKey("Person"), Column(Order = 0)] 
    public int PersonID { get; set; } 
    [ForeignKey("Person"), Column(Order = 1)] 
    public int PersonSsn { get; set; } 

    public virtual Person Person { get; set; } 
} 
0

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

Конфигурация Person

public class PersonEntityTypeConfiguration : EntityTypeConfiguration<Person> 
{ 
    public PersonEntityTypeConfiguration() 
    { 
     HasKey(t => new { t.ID, t.Ssn }); 
     Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
    } 
} 

Конфигурация автомобиля

public class CarEntityTypeConfiguration : EntityTypeConfiguration<Car> 
{ 
    public CarEntityTypeConfiguration() 
    { 
     HasKey(t => new { t.ID, t.ChassisSerial }); 
     Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

     HasOptional(t => t.Person).WithMany().HasForeignKey(t => new { t.PersonID, t.PersonSsn }); 
    } 
} 

И в классе Context, вы регистрируетесь в OnModelCreating

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Configurations.Add(new PersonEntityTypeConfiguration()); 
    modelBuilder.Configurations.Add(new CarEntityTypeConfiguration()); 

    base.OnModelCreating(modelBuilder); 
} 
+0

Я знаю, что свободный API может быть решением.Но я использую это выше для API-интерфейса Odata. И я не знаю, как использовать свободный API там. – Ankit

+0

Ответственность за уровень инфраструктуры, если вы используете Layered Project. Но в любом случае вы можете создать папку «Конфигурация» в своем проекте и поместить в нее классы EntityTypeConfiguration, а в вашем классе Context вы зарегистрируете эти классы в качестве кода выше. –

+0

@ Аните, что вы решили? –

0

Я нашел этот вопрос, когда смотрел на контекстный класс.

Проблема была связана с уже существующим составным ключом FirstName-LastName, определенным в контексте класса, используя как автомобиль, так и человека as DbSet.

Car_Person_Target_Car_Person_Source:: Типы всех свойств в зависимой Роль реляционного ограничения должны быть такими же, как и соответствующие типы недвижимости в основную роль. Тип property 'PersonSsn' по объекту 'Автомобиль' не соответствует типу Недвижимость LastName Объект 'Лицо' в референтном ограничении 'Car_Person'.

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