0

ナビゲーションプロパティを片側だけにして、1対1の関係を作成しようとしています(MVC4、EF5、コードファースト)。

public class User {

  public int UserId { get; set; } //PK

  public int RankId { get; set; } //FK

  public virtual Rank { get; set; } //Navigation

}

public class Rank {

  public int RankId { get; set; }

}

構成:

 public class RankConfiguration : EntityTypeConfiguration<Rank>
{
    public RankConfiguration()
    {
      HasKey(e => e.RankId);
      Property(e => e.RankId)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
    }
}

public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration ()
    {
      // PK
      HasKey(e => e.UserId);

      Property(e => e.RankId)
        .IsRequired();

      HasRequired(e => e.Rank)
        .WithRequiredDependent()
        .WillCascadeOnDelete(true);
    }
}

私が見ているもの(そして私が知っていることはほとんどありません)では、dbは正しく生成されていますが、次のエラーが発生します:

ReferentialConstraintの依存プロパティは、ストアで生成された列にマップされます。列:'UserId'。

最初の試みでは、結合テーブル(ここではナビゲーターなしでEF5 Fluent APIを1対1で参照)を作成することを考えていました。それが良いアイデアかどうかはわかりませんが、FluentAPIでは実行できませんでした。

なぜ、何が間違っているのかわかりません..何か助けはありますか?よろしくお願いします

アップデート

最初の試行@soadypコメントの 後、結合テーブルを使用して1対1で構成しようとしました

HasRequired(e => e.Rank)
    .WithRequiredDependent()
    .Map(m =>
    {
      m.ToTable("UserRank");
      m.MapKey("RankId");
    })
    .WillCascadeOnDelete(true);

しかし、移行しようとすると次のエラーが発生します。

The specified table 'UserRank' was not found in the model. 
Ensure that the table name has been correctly specified.

2回目の試行このhttp://weblogs.asp.net/manavi/archive/2011/04/14/associations-in-ef-4-1-code-first- を読んだ後、おそらく私は単純な仕事を複雑にしすぎていますpart-3-shared-primary-key-associations.aspxこのように変更しました

  HasRequired(e => e.Rank)
    .WithOptional()
    .WillCascadeOnDelete(true);

すべて問題ありませんが、UserId PKがIdentityとして設定されていません(行を挿入すると明らかな問題が発生します)。IDとして指定した場合:

  Property(e => e.UserId)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

次のエラーが発生します。

Cascading foreign key 'FK_dbo.Users_dbo.Ranks_UserId' cannot be created where 
the referencing column 'Users.UserID' is an identity column.
Could not create constraint. See previous errors.
4

2 に答える 2

1

OK、それで私はあなたのコードをコピーしてそれを試しました、そして私の答えは複数の部分に分かれています:

  1. 現在の構成では、生成されたデータベースが何らかの形で混乱しています。Usersテーブルで「UserId」がFKになっているので(理由はわかりません)、「RankId」は通常の整数プロパティになっています(そうではありません)。キー)、つまり、これが、ReferentialConstraintについて言及した最初の例外をトリガーするものだと思います。これについて考えると、データベースは「UserId」が主キーであると同時に外部キーであることを認識しているためですが、 「RankId」である「UserId」によって参照される実際のキーはデータベースで生成されないため、データベースはこのすべての情報をどのように把握する必要がありますか。
  2. 「これを修正するための正しい構成があるかもしれませんが、見つかりませんでした。そのため、これを解決するために、流暢な構成を削除し、Entity Frameworkが慣例によりすべてを作成し、すばらしい仕事をしました(ユーザークラスは実際には外部キーです)。

アドバイスとして、構成の何が問題になっているのかを確認し、SQL Server Management Studioまたはその他のツールを使用して変更を加えるたびに、生成されたデータベーススキーマをチェックして、目的のスキーマであることを確認する必要があります。構成は必要ありません。使用しないでください。

于 2013-02-22T01:20:12.557 に答える
1

EFの最初の1:1コードでは、従属テーブルに同じ主キーが必要です。そうでなければ、あなたがやりたいことがうまくいくでしょう。

同様のSO投稿 コードファーストとFluentAPIを1対1の関係で編集

これがMSEFサイトのサンプルです。http://msdn.microsoft.com/en-us/data/jj591620#RequiredToRequired

于 2013-02-21T08:13:23.960 に答える