2013-07-30 32 views
9

tôi đã có những lớpEF Migrations: Câu lệnh ALTER TABLE mâu thuẫn với KEY constraint NƯỚC NGOÀI

public class Bid : ... 
{ 
    ... 

    [Required] 
    public virtual TraderUser Trader { get; set; } 
} 

public class TraderUser : ... 
{ 
    ... 
} 

sau đó tôi đã thay đổi các lớp này theo cách sau và thêm một lớp mới

public class Bid : ... 
{ 
    ... 

    [Required] 
    public virtual TraderUser TraderUser { get; set; } 
} 

public class TraderUser : ... 
{ 
    ... 

    public int TraderCompanyId { get; set; } 

    [ForeignKey("TraderCompanyId")] 
    public virtual TraderCompany TraderCompany { get; set; } 
} 

public class TraderCompany : ... 
{ 
    ... 
} 

Khi tôi đã làm một cơ sở dữ liệu cập nhật Tôi nhận được lỗi sau đây

ALTER TA Tuyên bố BLE xung đột với ràng buộc KEY NGOÀI "FK_dbo.Bid_dbo.TraderUser_TraderUser_Id". Xung đột xảy ra trong cơ sở dữ liệu "LeasePlan.Development", bảng "dbo.TraderUser", cột 'Id'.

Tôi không thể cập nhật cơ sở dữ liệu. Bất kỳ sự giúp đỡ nào cũng được đánh giá cao.

+0

Bạn đang cố gắng đạt được những mối quan hệ nào giữa 3 lớp này? Và có bất kỳ thuộc tính nào trong lớp 'TraderCompany' không? – SOfanatic

+0

Giá thầu có người dùng nhà giao dịch và người dùng nhà giao dịch có công ty thương nhân. TraderCompany chỉ có một vài thuộc tính chuỗi. –

Trả lời

24

Không biết nếu quá muộn, nhưng tôi có cùng một vấn đề và có thể điều này có thể giúp bạn.

Tôi không thể nhìn thấy từ bài đăng của bạn, nhưng có thể bảng TraderUser của bạn đã chèn một số hàng. Những gì bạn đang cố gắng thực hiện là tạo ra bảng TraderCompany mới và tạo mối quan hệ khóa ngoài trong TraderUser trỏ đến bảng TraderCompany.

Trong một lần di chuyển bạn đang cố gắng tạo mối quan hệ khóa ngoài không có giá trị cho bảng đã chứa dữ liệu.

Bạn có thể thử những điều sau đây:

  • di cư đầu tiên - tất cả mọi thứ cùng, ngoại trừ dòng này

    public int TraderCompanyId { get; set; } 
    

    nên

    public int? TraderCompanyId { get; set; } 
    

    Điều này sẽ cho phép bạn tạo nullable cột khóa ngoài.

  • Cập nhật cột TraderCompanyId của bạn cho dữ liệu hiện có với một số hàng từ bảng TraderCompany.

  • Thứ hai di cư - Thay đổi mã từ

    public int? TraderCompanyId { get; set; } 
    

    để

    public int TraderCompanyId { get; set; } 
    

    và chạy chuyển đổi của bạn.

Tôi hy vọng điều này sẽ giúp bạn.

0

Cách khác là thêm câu lệnh SQL trong mã di chuyển để chèn một hàng trước khi thêm khóa ngoại. Dưới đây là ví dụ về những gì tôi đã làm:

 // Countries is a new table 
     CreateTable(
      "dbo.Countries", 
      c => new 
       { 
        CountryID = c.Int(nullable: false, identity: true), 
        Name = c.String(), 
        Currency = c.Int(nullable: false), 
       }) 
      .PrimaryKey(t => t.CountryID); 
     // Heres where i insert a row into countries 
     Sql("INSERT INTO Countries (Name, Currency) VALUES ('United Kingdom', 0)"); 
     // I set the default value to 1 on the ID fields 
     AddColumn("dbo.Brokers", "CountryID", c => c.Int(nullable: false, defaultValue: 1)); 
     AddColumn("dbo.Products", "CountryID", c => c.Int(nullable: false, defaultValue: 1)); 
     AddForeignKey("dbo.Brokers", "CountryID", "dbo.Countries", "CountryID", cascadeDelete: false); 
     AddForeignKey("dbo.Products", "CountryID", "dbo.Countries", "CountryID", cascadeDelete: false); 
     // Migrations then creates index's 
     CreateIndex("dbo.Brokers", "CountryID"); 
     CreateIndex("dbo.Products", "CountryID"); 
Các vấn đề liên quan