2016-02-04 3 views
1

Я создал всю свою модель, а затем добавил новую миграцию с Add-Migration Initial.Add-Migration имя одного столбца указано более одного раза

Добавление миграции создало файл миграции, как и ожидалось в папке миграции, но по какой-то причине он дважды создал столбец с именем client_id. Я ожидаю создать столбец с именем client_id с целым типом, а не с нулевым значением.

Следует отметить, что колонка client_id ссылается на модель Clients с отношением.

Вот как моя модель класса выглядеть

[Table("scripter_campaigns")] 
public class Campaign 
{ 
    [Key] 
    [Column(Order = 1)] 
    public int id { get; set; } 

    [Column(Order = 2)] 
    [StringLength(200)] 
    [Required] 
    [MinLength(5, ErrorMessage = "The title must be greater than 5 characters in length"), 
    MaxLength(200)] 
    public string name { get; set; } 

    [Column(Order = 3)] 
    [StringLength(200)] 
    public string layout { get; set; } 

    [Column(Order = 4)] 
    [StringLength(200)] 
    public string call_list_server_name { get; set; } 

    [Column(Order = 5)] 
    [StringLength(200)] 
    public string call_list_table_name { get; set; } 

    [StringLength(200)] 
    public string status { get; set; } 


    public string intro_url { get; set; } 
    public string use_transfer { get; set; } 
    public string route_callback_to { get; set; } 
    public string call_list_database_name { get; set; } 
    public int client_id { get; set; } 

    public DateTime? created_at { get; set; } 
    public DateTime? modified_at { get; set; } 

    public virtual Client Client { get; set; } 
    //Initilize the default value 

    public Campaign() 
    { 
     status = "Active"; 
     use_transfer = "No"; 
     route_callback_to = "Self"; 
    } 

} 

но он генерировал этот код для метода вверх() в миграции сценария

CreateTable(
     "dbo.scripter_campaigns", 
     c => new 
      { 
       id = c.Int(nullable: false, identity: true), 
       name = c.String(nullable: false, maxLength: 200), 
       layout = c.String(maxLength: 200), 
       call_list_server_name = c.String(maxLength: 200), 
       call_list_table_name = c.String(maxLength: 200), 
       status = c.String(maxLength: 200), 
       intro_url = c.String(), 
       use_transfer = c.String(), 
       route_callback_to = c.String(), 
       call_list_database_name = c.String(), 
       client_id = c.Int(nullable: false), 
       created_at = c.DateTime(), 
       modified_at = c.DateTime(), 
       Client_id = c.Int(), 
      }) 
     .PrimaryKey(t => t.id) 
     .ForeignKey("dbo.clients", t => t.Client_id) 
     .Index(t => t.Client_id); 

Я не понимаю, где Client_id = c.Int() исходит из но это вызывает у меня проблему при попытке обновить базу данных.

Произошла ошибка

Имена столбцов в каждой таблице должны быть уникальными. Имя столбца «Client_id» в таблица «scripter_campaigns» указана более одного раза.

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

ответ

5

Client_id = c.Int() создается из-за public virtual Client Client { get; set; }

Это потому, что вам нужно сделать следующее

[ForeignKey("Client")] 
public int client_id { get; set; }  

Когда вы следующие в классе сущностей

public virtual Client Client { get; set; } 

Таким образом [Table("scripter_campaigns")] будет знать, откуда приходит client_id.

Обновление:[ForeignKey("Client")] инструктирует public int client_id { get; set; } для хранения значения от public virtual Client Client { get; set; } объекта. Дайте этому объекту scripter_campaigns объект связан с объектом Client.

+0

Может быть, я не понимаю, что делает ключевое слово virtual. что делает [ForeignKey («Клиент»)]? –

+0

@MikeA На мой взгляд, виртуальный позволяет ленивую загрузку. '[ForeignKey (« Клиент »)]' говорит, что 'public int client_id {get; задавать; } 'будет хранить значение из' public virtual Client Client {get; задавать; } 'object – Komengem

+0

И есть ли способ не использовать внешние ключи? Внешние ключи добавят накладные расходы, которые я хотел бы получить от –