0

私の現在のプロジェクト(これは本当に小さいです)では、EFを使用して操作したい3つのテーブル/ POCOエンティティがあります。

表は次のとおりです。

  1. ステータス(ステータスの詳細を含む)
  2. StatusStatusType(多対多の関係のために必要です)
  3. StatusType(タイプごとにステータスをグループ化するために使用されるテーブル)

以下に示すように、データベースとユーザーコードに新しいステータスを作成したいと思います。

//Create new status (POCO) entity
var newStatus = new Status {
    StatusId = status.Id,
    UserId = user.Id,
    Text = status.text,
    CreateDate = DateTime.Now
};

// Persist need status to database
using (var db = new demoEntities())
{
    db.Statuses.AddObject(newStatus);
    db.SaveChanges();
}

このコードは正常に機能しますが、ステータスエンティティのStatusTypeも設定したいと思います。考えられるすべてのステータスタイプは、StatusTypeテーブルにすでに含まれています。新しいステータスを作成したくないのは、参照を作成するだけです。

私は私が次のようなものを使うべきだと考えました:

status.StatusTypes == "new";

更新22-04-201213:31

この例は単純化されており、ソリューション内の複数のプロジェクトにまたがっています。このため、作成セクション内のコード(demoEntitiesなど)を使用したくないのですが、参照する必要のあるステータスのPKはわかっています。

4

1 に答える 1

2

ステータス タイプが既に存在することがわかっている場合は、その主キーも必要です。主キーの値を取得したら、次のアプローチを使用できます。

var newStatus = new Status {
    StatusId = status.Id,
    UserId = user.Id,
    Text = status.text,
    CreateDate = DateTime.Now
};

// Just dummy object for existing status type
var existingStatusType = new StatusType {
    Id = existingStatusTypeId
};

// Persist need status to database
using (var db = new demoEntities())
{
    db.Statuses.AddObject(newStatus);
    // First let EF know that the status type already exists
    // Attaching prior to making relation is important!
    db.StatusTypes.Attach(existingStatusType);
    // Now make relation between new and existing entity 
    newStatus.StatusTypes.Add(existingStatusType);
    db.SaveChanges();
}

永続化コード内でリレーションを作成したくない場合は、少し異なるアプローチを使用する必要があります。

var newStatus = new Status {
    StatusId = status.Id,
    UserId = user.Id,
    Text = status.text,
    CreateDate = DateTime.Now
};

// Just dummy object for existing status type
var existingStatusType = new StatusType {
    Id = existingStatusTypeId
};

newStatus.StatusTypes.Add(existingStatusType);

// Persist need status to database
using (var db = new demoEntities())
{
    // This will add both newStatus and existingStatusType as new entities
    db.Statuses.AddObject(newStatus);
    // You must fix it to make sure that existingStatusType is not inserted 
    // to database again
    status.StatusTypes.ForEach(st =>
        db.ObjectStateManager.ChangeObjectState(st, EntityState.Unchanged));
    db.SaveChanges();
}
于 2012-04-22T10:13:25.437 に答える