0

エンティティProfessionalEmploymentRecord EFに1つのレコードを挿入すると、各エンティティの既存のProfessional、Program、Roleレコードがそれぞれ複製されるという問題があります。データベース内の既存のキーと値のペアを使用して、Professional、Program、Role を明示的に初期化しようとしましたが、EF は新しいキーで重複する値を作成します。

public class ProfessionalEmploymentRecord
{
    public int ProfessionalEmploymentRecordId {get; set; }

    public virtual Professional Professional { get; set; }
    public virtual Program Program { get; set; }
    public virtual Role Role { get; set; }
}
public class Program
{
    public int ProgramId { get; set; }
    [MaxLength(20)]
    public string Name { get; set; }
}
public class Role
{
    public int RoleId { get; set; }
    [MaxLength(50)]
    public string Name { get; set; }
}
public class Professional
{
    public int ProfessionalId { get; set; }
    [MaxLength(20)]
    public string Name { get; set; }
}

以下の Create を使用すると、関連する 3 つのエンティティに新しいレコードが作成されますが、それらは存在し、キー セットがあります。つまり、関連する 3 つのエンティティに新しい主キー (1 ずつ増加) を持つ値のコピーが作成されます。

    public ActionResult Create(ProfessionalEmploymentRecord professionalemploymentrecord)
    {
        if (ModelState.IsValid)
        {
            db.ProfessionalEmploymentRecords.Add(professionalemploymentrecord);
            db.SaveChanges();
            return RedirectToAction("Index");  
        }
        return View(professionalemploymentrecord);
    }

要求通り

@model My.Models.ProfessionalEmploymentRecord
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
    <legend> Professional Employment Record</legend>

    <div class="editor-label">
        Professional
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Professional.Name)
        @Html.ValidationMessageFor(model => model.Professional.Name)
    </div>
    <div class="editor-label">
         Program
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Program.Name)
        @Html.ValidationMessageFor(model => model.Program.Name)
    </div>
    <div class="editor-label">
         Role
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Role.Name)
        @Html.ValidationMessageFor(model => model.Role.Name)
    </div>
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

<div>
@Html.ActionLink("Back to List", "Index")
</div>

以下のコードを使用してテストしました。(SaveChanges を実行すると *Id++ が reco に設定されることがわかります)。

    public void TestDummyAdd()
    {
        Professional prof = new Professional { ProfessionalId = 1, Name = "Chris" };
        Program prog = new Program { ProgramId = 1, Name = "A" };
        Role role = new Role { RoleId = 1, Name = "B" };
        ProfessionalEmploymentRecord reco = new ProfessionalEmploymentRecord { Professional = prof, Role = role, Program = prog, ProfessionalEmploymentRecordId = 0 };

        if (ModelState.IsValid)
        {
            db.ProfessionalEmploymentRecords.Add(reco);
            db.SaveChanges();
        }
    }
4

1 に答える 1

1

Add は、オブジェクトグラフ全体に対して実行される操作です。レコードを追加すると、そのすべての関係、それらの関係なども追加されます。この問題を解決する方法は 2 つあります。どちらの方法でも、永続化されたオブジェクト グリップ内の一部のエンティティ (場合によっては関係も) の状態を手動で設定する必要があります。

  • あなたがしたように呼び出しAddますが、その後、グラフ内のすべての既存のエンティティの状態をUnchangedまたはに設定する必要がありますModified(エンティティはデータベースで更新されます)
  • すべての新しいエンティティの状態を設定するAttach代わりに呼び出すAddAdded

設定状態は次の方法で実行できます。

db.Entry(entity).State = EntityState.Added;
于 2012-08-08T15:01:48.707 に答える