1

私は2つのテーブルを持っています:

[Table("Ticket_Admins")]
public class TicketAdmin
{
    public TicketAdmin()
    {
        Name = new Record();
        Name.IsRevisioned = false;
        Name.IsVisible = true;
        Name.Category = typeof(TicketAdmin).Name;
    }
    [Key]
    public int Id { get; set; }
    public virtual Record Name { get; set; }
    public virtual TicketPost Post { get; set; }
    public virtual UserProfile User { get; set; }
}

[Table("UserProfile")]
public class UserProfile
{
    private string _email;

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]       
    public int UserId { get; set; }
    public string Email 
    {
        get { return _email; }
        set { _email = value.ToLower(); }
    }
}

そして、それらをコンテキストにマッピングします。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<TicketAdmin>()
            .HasRequired(x => x.User)
            .WithRequiredPrincipal();
        base.OnModelCreating(modelBuilder);
    }

しかし、移行時にエラーが発生します:

ALTERTABLEステートメントがFOREIGNKEY制約「FK_dbo.UserProfile_dbo.Ticket_Admins_UserId」と競合しました。データベース「aspnet-BoomzHelperPortal-dbv3」、テーブル「dbo.Ticket_Admins」、列「Id」で競合が発生しました。

私はここで何か間違ったことをしていますか?私が正確にやろうとしているのは、ID()でMyTicketAdminをマップすることです。UserProfileUserProfile.UserId = TicketAdmin.Id

あなたの時間のためにあなたをありがとう!

更新:このシェマで空のデータベースを作成しようとしたところUserProfile.UserId、外部キー列が作成されることがわかりましたが、必要なTicketAdmin.IdのはFK列になることです。(すべてのユーザーがUserProfileを持っているようですが、すべてのユーザーがTicketAdmin設定を持っているわけではなく、TicketAdminはUserProfileの子であり、UserProfile IDと同じIDを持っています)。

4

4 に答える 4

6

必要な関係(null許容でない外部キー)を追加する場合は、次のいずれかの条件が満たされている必要があります。

  • 外部キー(Ticket_Adminsこの場合)を含むテーブルは空である必要があります。
  • 外部キーの列は以前に存在し、その列のすべての値には関連エンティティの有効なキーが含まれています
于 2013-02-26T11:04:46.670 に答える
2

これは、この制約に一致しないデータがすでに含まれているテーブルに外部キーを追加しているためです。データを削除するか(可能な場合)、制約に合わせてデータを変更してみてください。そうでない場合は、制約を変更する必要があります。

また、2つの主キーの間に外部キーを追加しようとしているようです。それが可能かどうかはわかりません。Ticket_Adminsテーブルを変更してUserIdフィールドを含めることを検討してください。

[Table("Ticket_Admins")]
public class TicketAdmin
{
    public TicketAdmin()
    {
        Name = new Record();
        Name.IsRevisioned = false;
        Name.IsVisible = true;
        Name.Category = typeof(TicketAdmin).Name;
    }
    [Key]
    public int Id { get; set; }
    public int UserId { get; set; }
    public virtual Record Name { get; set; }
    public virtual TicketPost Post { get; set; }
    public virtual UserProfile User { get; set; }
}

次に、間に外部キーを作成しますUserProfile.UserId = Ticket_Admins.UserId

于 2013-02-26T11:07:27.000 に答える
2

わかりました。必要なのは、ForeignKeyを次のように設定することだけです。

[Table("Ticket_Admins")]
public class TicketAdmin
{
    public TicketAdmin()
    {
        Name = new Record();
        Name.IsRevisioned = false;
        Name.IsVisible = true;
        Name.Category = typeof(TicketAdmin).Name;
    }
    [Key]
    public int Id { get; set; }
    public virtual Record Name { get; set; }
    public virtual TicketPost Post { get; set; }
    [ForeignKey("UserId")]
    public virtual UserProfile User { get; set; }
}

そしてそれがすべてです。これで、外部キーが適切に生成されます。

于 2013-02-26T12:51:24.100 に答える
0

存在テーブルの新しい外部キーを作成しようとしている場合は、存在テーブルのすべてのデータを削除する必要があります。すべてのレコードに外部キーが必要なため、すでに作成されているが外部キーがないレコードもあります。

于 2014-01-20T02:50:02.393 に答える