0

データベースのMyModelテーブルに行を追加し、その新しい行に関する通知を別のテーブルに作成しています。通知を適切に作成するには、新しく作成したMyModel行のIDが必要です。新しく追加されたデータ内で利用可能な一意の識別情報がなくても、新しく追加された行のIDをすぐに取得するにはどうすればよいですか?

これは私のコントローラからの私のコードです:

MyModel newMyModel = new MyModel 
{ 
    Title = appliedCourse.Title, 
}; 
db.MyModel.Add(); 

// I need code here that finds the MyModel.ID - but I do not know how to search for this MyModel 
// because MyModel.Title is not necessarily unique - the only necessarily unique piece of data 
// would be the MyModel.ID 
new MyModel MyModelWithId = db.MyModel.Find(MyModel) // <- that does not work 

Notification newNotification = new Notification 
{ 
    Time = DateTime.Now, 
    Link = Url.Action("Details", "MyModel", newMyModelWithId.MyModelID), 
    ViewableBy = "Admin", 
    Complete = false 
}; 
db.Notification.Add(newNotification); 
db.SaveChanges(); 

は、新しく作成されたmymodelというのIDを取得する方法はありますか?

「IDの最大値」を検索して返すことが考えられますが、それが最も効果的な方法かどうかはわかりません。

IDは、必要な時点で作成されていますか、db.SaveChanges()を実行する必要がありますか。それを検索する前に電話しますか?

MyModelにIDを取得するためにデータベースにクエリを送信できるように、MyModelに固有の値を追加する必要がありますか?私はDateTimeCreated値を考えていたし、私はこのようにそれを検索します(IDはすでに将来のクエリのための私のユニークな値であるが):DateTimeの方法は、いずれかの非常に効率的である場合

new MyModel MyModelWithId = db.MyModel.FirstOrDefault(
       o => o.TimeDateCreated == MyModel.TimeDateCreated); 

わかりません。

答えて

1

変更を保存するまで、行IDは取得されません。

例では、SaveChangesを2回押す必要があります。 MyModelを保存してIDを生成すると、URLNotificationでnewNotificationを保存します。

MyModel newMyModel = new MyModel 
{ 
    Title = appliedCourse.Title, 
}; 
db.MyModel.Add(); 

// Save first, let the DB generate the ID. 
// The DB generated ID will automatically load into the object you just saved. 
db.SaveChanges(); 

Notification newNotification = new Notification 
{ 
    Time = DateTime.Now, 
    Link = Url.Action("Details", "MyModel",new { id = newMyModel.ID }), 
    ViewableBy = "Admin", 
    Complete = false 
}; 
db.Notification.Add(newNotification); 
db.SaveChanges(); 

マインドもしあなたが本当に説得力のある理由を持っていない限り、私は新しい通知がモデル自体の一部として表示していないされているUrl.Actionを生成することがあります。代わりに、あなたは参照を保持することができ、その方法は一度だけ保存します。つまり、これはあなたのユースケースを知らなくても大まかな推測です。

+0

完璧に動作します、ありがとうございます。変更内容をデータベースに保存する行為は、この文脈ではvar newMyModelを更新することは直感的ではありませんでした。知っていることは素晴らしいことです。再度、感謝します。 – Ecnalyr

0

MyModelにNotificationsプロパティがある場合、または通知にMyModelプロパティ(ナビゲーションプロパティEF4 Code First: how to add a relationship without adding a navigation property)がある場合は、オブジェクト参照を設定して、それらの間のリンクを設定することができます。その後、db.SaveChanges()と呼ぶと、あなたのためにIDを設定するのは正しいことです。この場合、別の方法でIDを使用したいので、この場合はうまくいかないようです。

関連する問題