【问题标题】:Getting identity column value using entity framework 4.1使用实体框架 4.1 获取标识列值
【发布时间】:2012-05-11 21:38:24
【问题描述】:

我正在使用实体框架 4.1(VS 2010、SQL Server 2012)将数据插入数据库。 首先,我创建一个对象的实例,用值填充属性并调用 AddObject(),如下所示:

VideoData videodata = new VideoData();
videodata.StartCaptureTime = startCaptureTime;
videodata.EndCaptureTime = endCaptureTime;
videodata.CameraID = CameraID;

using (var context = new PercEntities())
{             
    if (context.VideoDatas.Where(c => c.VideoID == videoID).Count() == 0)
    {
       var videoData = new VideoData
       {
           StartCaptureTime = startCaptureTime,
           EndCaptureTime = endCaptureTime,
           CameraID = CameraID,
       };
    context.VideoDatas.AddObject(videoData);
    context.SaveChanges();
   }
}

问题是,数据库中的表有一个标识列:

VideoID int IDENTITY(1,1)

并且我需要获取标识函数插入的值,以填充具有 VideoID 作为外键的其他对象。例如:

FrameData frameData = new FrameData();
frameData.VideoID = videodata.VideoID;
frameData.Path = path;

我唯一能想到的就是在 AddObject(videoData) 之后立即查询最大标识,但我害怕竞争条件。

我是 Entity Framework 的新手,所以我很乐意为此提供任何指导。

【问题讨论】:

    标签: entity-framework-4.1 identity-column


    【解决方案1】:

    如果您有其他需要 VideoID 作为 FK 的对象,您只需在 VideoData 和其他类型之间正确配置导航属性,EF 会为您处理。

    调用AddObject 不会将您的数据插入数据库,因此您无法在此调用后获取标识值。只有调用 SaveChanges 才会将您的所有更改推送到数据库,并且在此调用期间,EF 将在内部处理引用完整性(但前提是您的模型正确配置了关系)。

    在调用SaveChanges 后,如果您已正确配置所有内容,您的VideoID 应该会自动填充。

    【讨论】:

    • 感谢您的快速回答。这确实是一个配置问题。
    猜你喜欢
    • 2017-01-06
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多