ナビゲーションプロパティを片側だけにして、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.