如何在新添加的数据中没有任何其他唯一标识信息的情况下立即检索新添加的行ID?

时间:2012-05-04 12:03:52

标签: asp.net-mvc asp.net-mvc-3 entity-framework notifications

我在数据库中向表MyModel添加一行,然后在另一个表中创建有关该新行的通知。我需要新创建的MyModel行的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值&#39;并返回 - 但我不确定这是否是最有效的方式。

ID是否在我需要时创建,或者我是否需要执行db.SaveChanges();在搜索之前打电话?

是否有必要为MyModel添加一个唯一值,以便我可以查询数据库以便它以这种方式获取它的ID? (虽然ID已经是我未来查询的唯一值)我在想一个DateTimeCreated值,我会像这样搜索它:

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

不确定DateTime方法是否也非常有效。

2 个答案:

答案 0 :(得分:2)

在保存更改之前,您不会获得该行的ID。

在您的示例中,您必须两次点击SaveChanges。一旦保存MyModel并生成ID,则使用URL.Action保存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,而不是模型本身的一部分。相反,你可以持有一个参考,这样只保存一次。话虽如此,在不知道您的用例的情况下,这是一个粗略的猜测。

答案 1 :(得分:0)

如果MyModel具有Notifications属性或者Notification具有MyModel属性(导航属性EF4 Code First: how to add a relationship without adding a navigation property),则可以通过设置对象引用来装配它们之间的链接。然后,当您致电db.SaveChanges()时,它会为您设置ID。在这种情况下,似乎不适合你,因为你想以另一种方式使用id。