0

学校が登録できる登録フォームがあります。明らかなログインと一般的な詳細に加えて、学校は施設と認定のリストから選択できます。

私のデータは美しく表示され、正しくバインドされています。

問題リンカー テーブルにデータを入力しても機能しません。私が試したさまざまな方法でエラーがスローされます。

方法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ステートメントには終了しました。」}

私がどこで間違っているのか知っているなら、私に知らせてください。リンカーテーブルの日付を更新する例があるようです(とにかくある時点で必要になります)が、私の問題の例が見つかりません...

前もって感謝します。

4

1 に答える 1

0

答えを見つけたようです:

MVC: INSERT ステートメントが FOREIGN KEY 制約と競合しました

プルされた私のデータには、基本的に正しい外部キー値 (0 - 存在しませんでした) が含まれておらず、当然のことながら、私の DB はエラーをスローしていました。読んでくれた人に時間を無駄にして申し訳ありません。時間を割いてくれてありがとう。これが他の誰かを助けることができることを願っています。

ジョー

于 2013-02-07T11:58:27.847 に答える