0

我正在向数据库中的表 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 值”并返回它——但我不确定这是否是最有效的方法。

ID 是在我需要的时候创建的,还是我需要做一个 db.SaveChanges(); 在搜索之前打电话?

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

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

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

4

2 回答 2

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,而不是作为模型本身的一部分。相反,您可以保存一个引用,这样只能保存一次。话虽如此,在不知道您的用例的情况下,这是一个粗略的猜测。

于 2012-05-04T12:19:19.690 回答
0

如果 MyModel 具有Notifications属性或 Notification 具有MyModel属性(导航属性EF4 代码优先:如何在不添加导航属性的情况下添加关系),您可以通过设置对象引用来装配它们之间的链接。然后,当您致电时db.SaveChanges(),它会为您设置 ID。在这种情况下,这似乎对您不起作用,因为您想以另一种方式使用 id。

于 2012-05-04T14:31:37.387 回答