学校が登録できる登録フォームがあります。明らかなログインと一般的な詳細に加えて、学校は施設と認定のリストから選択できます。
私のデータは美しく表示され、正しくバインドされています。
問題リンカー テーブルにデータを入力しても機能しません。私が試したさまざまな方法でエラーがスローされます。
方法1:
MembershipUser membershipUser = null;
if (schoolRegisterModel != null)
{
if (null != DB)
{
school SchoolUser = new school();
SchoolUser.username = schoolRegisterModel.UserName;
SchoolUser.email = schoolRegisterModel.Email;
string sPassowrdSalt = Security.Instance().CreateSalt();
SchoolUser.password = Security.Instance().CreatePasswordHash(schoolRegisterModel.Password, sPassowrdSalt);
SchoolUser.password_salt = sPassowrdSalt;
..More data etc..
foreach (var item in schoolRegisterModel.Facilities)
{
if (item.@checked)
{
school_facility sf = new school_facility();
sf.facility_id = item.facility_id;
SchoolUser.school_facility.Add(sf);
}
}
foreach (var item in schoolRegisterModel.Accreditations)
{
if (item.@checked)
{
school_accreditation sa = new school_accreditation();
sa.accreditation_id = item.accreditation_id;
SchoolUser.school_accreditation.Add(sa);
}
}
DB.schools.Add(SchoolUser);
DB.SaveChanges();
エラー: {"INSERT ステートメントは、FOREIGN KEY 制約 \"FK_school_facility_facility\" と競合しました。競合は、データベース \"MYDB\"、テーブル \"dbo.facility\"、列 'facility_id' で発生しました。\r\nステートメントには終了しました。」}
また、この挿入物に基づいて生成される間もなく学校 ID を手動で取得する必要がありますか。この方法では、プライマリ テーブル (学校) のみを使用してリンカー テーブルにデータを直接入力することを回避できます。
方法 2:
プライマリ テーブル (学校) の認定と施設のコレクションを直接更新しようとする以外は、同じコードを繰り返します。前のクエリによって生成された最新のプライマリ キーを使用して、リンカー テーブルを個別に手動で更新します。このコードは次のとおりです。
MembershipUser MembershipUser = null;
if (schoolRegisterModel != null)
{
if (null != DB)
{
school SchoolUser = new school();
SchoolUser.username = schoolRegisterModel.UserName;
SchoolUser.email = schoolRegisterModel.Email;
string sPassowrdSalt = Security.Instance().CreateSalt();
SchoolUser.password = Security.Instance().CreatePasswordHash(schoolRegisterModel.Password, sPassowrdSalt);
SchoolUser.password_salt = sPassowrdSalt;
..More data etc..
// Linker data for facilities and accreditations.
// Facilities
foreach (var item in schoolRegisterModel.Facilities)
{
if (item.@checked)
{
school_facility sf = new school_facility();
sf.facility_id = item.facility_id;
sf.school_id = SchoolUser.school_id;
DB.school_facility.Add(sf);
}
}
// Accreditations
foreach (var item in schoolRegisterModel.Accreditations)
{
if (item.@checked)
{
school_accreditation sa = new school_accreditation();
sa.accreditation_id = item.accreditation_id;
sa.school_id = SchoolUser.school_id;
DB.school_accreditation.Add(sa);
}
}
m_DB.SaveChanges();
エラー: {"INSERT ステートメントは、FOREIGN KEY 制約 \"FK_school_facility_facility\" と競合しました。競合は、データベース \"MYDB\"、テーブル \"dbo.facility\"、列 'facility_id' で発生しました。\r\nステートメントには終了しました。」}
私がどこで間違っているのか知っているなら、私に知らせてください。リンカーテーブルの日付を更新する例があるようです(とにかくある時点で必要になります)が、私の問題の例が見つかりません...
前もって感謝します。