質問

私は現在かなり大きなデータベースを整理しています。データベースの一部は、1対0または1対1のマッピングである関係を持ちます。具体的には:

User -> UserSettings

すべてのユーザーにユーザー設定があるわけではありませんが、ユーザーなしではユーザー設定は存在できません。残念ながら、テーブルは既に存在しています。 UserにはPK IDがあります。 UserSettingsはPK IDと、現時点では真のFKではない(関係が定義されていない) User_Id_Fkという列をUser_Id_Fkいます。

私はそれを修正する過程にあり、DBの観点からSQLを使って行い、テストで確認しました。 (FK制約を追加し、 User_Id_Fkユニーク制約を追加しました。)これはすべてUserSettingsテーブルで行われました。 (注:ここではEFの移行は使用していません。この時点で手動でSQLを作成する必要があります)。

しかし、この新しいマッピングを適切に処理するために、既存のアプリケーションを結びつける必要があります。アプリケーションはASP.NET Core 1.0とEF7を使用しています。既存のデータモデルの(短縮された)バージョンです。

public class User
{
  public int Id { get; set; }

  public virtual UserSettings UserSettings { get; set; }
}

public class UserSettings
{
  public int Id { get; set; }

  [Column("User_Id_Fk")]
  public int UserId { get; set; }

  [ForeignKey("UserId")]
  public virtual User User { get; set; }
}

私はこのFluent Mappingも持っています:

builder.Entity<UserSettings>()
            .HasOne(us => us.User)
            .WithOne(u => u.User)
            .IsRequired(false);

アプリケーションを実行してデータベース内のこれらの項目にアクセスすると、このエラーが発生し、アプリケーションに直接関連する情報がないわかりにくい一連のメッセージが表示されます。

ArgumentNullException: Value cannot be null.
Parameter name: navigation
Microsoft.Data.Entity.Utilities.Check.NotNull[T] (Microsoft.Data.Entity.Utilities.T value, System.String parameterName) <0x10d28a650 + 0x00081> in <filename unknown>, line 0

研究をした後、誰かが、UserSettingsクラスのIDが外部キーと同じでなければならないと述べました。

public class UserSettings
{
  [Key, ForeignKey("User")]
  public int Id { get; set; }

  public virtual User User { get; set; }
}

DBは他のアプリケーションで使用されているので、私は現時点では制御できません。だから、私はここにこだわっていますか? 1:0..1マッピングのための適切な制約を持たない、1:多くのマッピング(現時点で起こりうるが、それはできないが)を維持しなければならないだろうか?

アップデート下記のoctaviocclの答えを見ると、私はそれを何の成功もなしに試してみました。しかし、私はUserSettingsのマッピングからUserを削除しUserSettings (ただし、私はUserIdを残しました)。私が知る限り、すべてが動作するように見えました。私は本当にここで何が起こっているのか混乱していますが、これが正解であっても、もし私がちょうど幸運になるのであれば、私は本当に混乱しています。

人気のある回答

データ注釈を削除し、これらの設定を試してください:

builder.Entity<UserSettings>()
            .Property(b => b.UserId)
            .HasColumnName("User_Id_Fk");

builder.Entity<User>()
            .HasOne(us => us.UserSettings)
            .WithOne(u => u.User)
            .HasForeignKey<UserSettings>(b => b.UserId);

EF Coreのドキュメントから:

外部キーを設定するときは、依存するエンティティタイプを指定する必要があります。上のリストのHasForeignKeyに提供されている汎用パラメータに注意してください。一対多の関係では、参照ナビゲーションを持つエンティティが従属オブジェクトであり、コレクションを持つエンティティが主体であることは明らかです。しかし、これは1対1の関係ではないため、明示的に定義する必要はありません。

引用されたリンクBlog - BlogImage )に示されている例は、あなたが達成しようとしているものとほとんど同じです。

上記のソリューションがうまくいかない場合、 User_Id_Fk列がnull許可するかどうかを確認する必要がありnull 。その場合は、FKプロパティの型をint?変更しint?

public class UserSettings
{
  public int Id { get; set; }

  public int? UserId { get; set; }

  public virtual User User { get; set; }
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ