2016-02-04 25 views
1

我创建了我的所有模型,然后我添加了一个新迁移Add-Migration Initial添加迁移一个列名不止一次

添加迁移在迁移文件夹中创建了与迁移文件类似的迁移文件,但由于某种原因,它创建了一个名为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()是来自但是当我尝试更新数据库时,它引起了我的问题

这里是错误

每个表中的列名必须是唯一的。 表'scripter_campaigns'中的列名'Client_id'被多次指定。

此外,数据库中的外键是否需要我能够在我的对象之间建立关系?

回答

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

可能是我不理解关键字虚拟做什么。 [ForeignKey(“Client”)]究竟做了什么? –

+0

@MikeA据我的理解,虚拟允许延迟加载。 '[ForeignKey(“Client”)]'说'public int client_id {get;组; }'将持有来自'公共虚拟客户端客户端{get;组; }'对象 – Komengem

+0

有没有办法不使用外键?当您调用公共虚拟客户端客户端{get;}时,外键会增加一个开销,我想从 –