0

次のような MS SQL SERVER テーブル構造があります。

Table Org {
  Id Int
  Name Varchar(50)
}

Table Request {
  Id Int
  Name Varchar(50)
  OrgId int Not Null
}

モデルは次のようになります。

public class Org
{
     public int Id { get; set;}
     public string Name { get; set;}
     public List<Request> Requests { get; set;}
}

public class Request
{
     public int Id { get; set;}
     public string Name { get; set;}
     public int OrgId { get; set;}
}

そして、私たちの構成は次のようなものです:

public class RequestConfiguration : EntityTypeConfiguration<Request>
{
    public RequestConfiguration()
    {

        HasRequired(o => o.Org)
           .WithMany(o => o.Requests)
           .HasForeignKey(o => o.OrgId);
     }
}

新しいリクエスト インスタンスを作成して Org を割り当てるたびに、Org テーブルに新しいレコードが作成されます。これは同じ dbcontext にあります。構成でさまざまなマッピングを試しましたが、すべて同じ動作になります。私は何を間違っていますか?

ありがとう!

4

1 に答える 1

0

Orgが既に存在することを EF に通知する必要があります。それ以外の場合、EF はOrgが新しく、データベースに挿入する必要があると見なします。データベースから既存のものをロードするかOrg、コンテキストにアタッチすることで実行できます。

using (var context = new MyContext())
{
    var newRequest = new Request();

    var existingOrg = new Org { Id = existingOrgId };
    context.Orgs.Attach(existingOrg);
    // or instead of the previous two lines:
    // var existingOrg = context.Orgs.Find(existingOrgId);

    newRequest.Org = existingOrg;

    context.Requests.Add(newRequest);
    context.SaveChanges();
}

これにより、既存の を参照Requestする外部キーを持つ新しい が挿入されます。OrgIdOrg

Org実際には、外部キー プロパティがあるため、インスタンスはまったく必要ありません。FK 値を設定するだけです。

    var newRequest = new Request();

    newRequest.OrgId = existingOrgId;

    context.Requests.Add(newRequest);
    context.SaveChanges();
于 2013-05-09T15:28:46.950 に答える