首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当实体映射到存储过程时,如何在调用SaveChanges()之后获取实体的标识

当实体映射到存储过程时,在调用SaveChanges()之后获取实体的标识可以通过以下步骤实现:

  1. 在实体类中定义一个自增主键字段,例如:
代码语言:csharp
复制
public class MyEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    // 其他字段
}
  1. 在数据库中创建一个存储过程,用于插入实体并返回自增主键值,例如:
代码语言:sql
复制
CREATE PROCEDURE InsertMyEntity
    @Param1 NVARCHAR(MAX),
    @Param2 NVARCHAR(MAX),
    -- 其他参数
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO MyEntity (Column1, Column2, -- 其他列)
    VALUES (@Param1, @Param2, -- 其他参数)

    SELECT SCOPE_IDENTITY()
END
  1. 在DbContext中定义一个新的方法,用于调用存储过程并返回自增主键值,例如:
代码语言:csharp
复制
public class MyDbContext : DbContext
{
    // 其他代码

    public int InsertMyEntity(MyEntity entity)
    {
        var parameters = new[]
        {
            new SqlParameter("@Param1", SqlDbType.NVarChar) { Value = entity.Column1 },
            new SqlParameter("@Param2", SqlDbType.NVarChar) { Value = entity.Column2 },
            // 其他参数
        };

        return this.Database.ExecuteSqlRaw("EXEC InsertMyEntity @Param1, @Param2, -- 其他参数", parameters);
    }
}
  1. 在业务逻辑中调用新定义的方法,并获取实体的标识,例如:
代码语言:csharp
复制
using (var context = new MyDbContext())
{
    var entity = new MyEntity { Column1 = "Value1", Column2 = "Value2" };
    var id = context.InsertMyEntity(entity);
    entity.Id = id;

    context.SaveChanges();
}

通过以上步骤,在调用SaveChanges()之后,可以获取实体的标识。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Entity Framework 4.1 Code-First 学习笔记

,T 就是实体类型 每一个属性都是读写属性 read/write ( get/set )   在这里,DbContext 基类通过反射来获取射到数据库实体。...,这一点可以理解,最小长度会在数据存储进行验证,如果小于2将会抛出异常,无法完成保存。   ...() { this.Configuration.LazyLoadingEnabled =false; } 禁用了延迟加载以后,查询一个实体时候,相关实体也一并加载。...DbSet.SqlQuery:这个方法返回实体将会被 EF 跟踪修改,所以,如果你在这些返回实体上做了修改, DbContext.SaveChanges调用时候,将会被处理。...你需要重写 DbContext.SaveChanges获取特定状态实体,实现自己数据操作逻辑来保存修改,然后在调用 base.SaveChanges 之前将这些实体状态切换到 Unmodified

1.6K10

Entity Framework快速入门--直接修改(简要介绍ObjectContext处理机制)

(2):ObjectStateManage,它职责是维护实体类型实例和关系实例对象状态和标识管理。也是EF上下文中非常重要一个属性。...每个实体做了修改时,EF帮我们把实体放到相应队列中并修改相应实体状态(EntityState),调用ObjectContextSaveChanges()方法,EF根据队列情况以及EDMX元数据映射信息生成最终...在创建实体之后、但将其添加到对象上下文之前,该实体处于此状态。...所以,我们在对应多个ObjectContext实例进行操作要注意,调用实例自己SaveChanges()方法,它只会对自己实例内存空间操作映射回数据库,而其他ObjectContext实例中实体集合修改都不受影响...而且EF自动帮我们做了缓存处理,当我们第一次查询某个实体它会自动帮我们从数据库取出数据,并装配成实体类交给我们开发人员,第二次获取相同数据,它会先从缓存中查找,如果已经存在数据了就立即返回,不会查询数据库

79230
  • EntityFramework 外键值映射

    如果在 EF OnModelCreating 中配置了实体外键映射,也就是 SQL Server 中 ForeignKey,那么我们在添加实体时候,主实体主键值会自动映射到实体外键值,并且这个操作在一个...Entity Framework 实体框架形成之旅--实体框架开发几个经验总结 在前阵子,我对实体框架进行了一定研究,然后把整个学习过程开了一个系列,以逐步深入方式解读实体框架相关技术,期间每每碰到一些新问题需要潜入研究...1、实体框架主键类型约束问题 在我们搭建整个实体框架过程中,我们一般都是抽象封装处理很多基础增删改查、分页等常见数据处理功能,如下所示。...本来想尝试在内部进行转换处理为正确类型,不过没有找到很好解决方案来识别和处理,因此最好解决方法,就是我们调用这些有object类型主键接口,传入正确类型即可。...不过这里我们是以混合式框架进行整合测试,因此实体框架各个方面的调用处理基本上保持一致。

    4.2K50

    在Entity Framework中使用存储过程(三):逻辑删除实现与自增长列值返回

    本篇文章通过实例方式,讨论两个在EF使用存储过程主题:如何通过实体存储过程映射实现逻辑删除;对于具有自增长类型主键数据表,在进行添加操作时候如何将正确值反映在实体对象上。...并删除属性IS_DELETED,最终得到如右图所示.edmx模型。然后为Contact实体映射CUD存储过程和相关参数,其中删除操作存储过程已经定义在上面。...并在删除前后根据ID获取对应记录,打印出来以验证上面设计筛选条件是否真的有效。...三、具有自增长列存储过程定义 接下来我们来讨论另一个常见场景:如果一个表中存在一个自增长列作为该表主键,当我们通过提交对应实体对象进行记录添加操作,数据库中真正键值如何返回并赋值给该实体对象...(一):实现存储过程自动映射 在Entity Framework中使用存储过程(二):具有继承关系实体存储过程如何定义?

    1.7K80

    EF简介

    一、添加完EF实体之后: 1、系统会自动生成一个(对应ef模块名.content.tt文件),  这个模版是帮助我们生成ef访问上下文,里面有一个数据库实体,上面这个例子是TestEntities实体...(4)ADO.NET将数据库结果返回给程序 通俗点说,就是ef帮助我们把实体变化翻译成sql语句,然后调用底层ADO.NET保存到数据库中去。...1、使用上下文操作数据库表,被操作表必须含有主键,否则回报错。...而里面的值就是我们刚才所添加值,说明在我们执行完数据库添加操作之后,数据库里面的数据马上将我们所添加数据马上映射给了当前实体对象,所以当我们在下面指定需要修改记录主键,如果修改和添加共用同一个对象...3、当我们在操作完数据库对应表示表实体后,执行dbContext.SaveChanges()后,编译器报一个实体或多个实体验证失败!

    1.4K80

    Entity Framework 简单增删改操作

    增加   在EF中添加操作一般有两种方式:一是直接创建对象,然后调用“DbSet””Add()”方法进行添加;二是调用数据库上下文”Entry()”方法并设置对应状态。...此外,在含有导航属性,将一个对象赋值给另一个对象导航属性也能达到添加效果(导航属性为”DbSet“集合时通过调用导航属性“Add()“方法也同样可以达到添加效果)。...状态跟踪  在这里我们需要强调一点那就是状态跟踪,对于上面的操作如果我们调用“Attach()”方法对实体进行跟踪或者设置实体状态那么数据将不会保存到数据库: ?...使用”Attach()”方法进行实体跟踪时会设置实体状态为“Unchanged”此时实体处于未修改状态,执行“SaveChange()”方法EF不会执行修改操作。...原因是EF会自动发现状态改变,在调用下面的方法状态发现是自动:   ?

    75231

    AsNoTracking

    Entity Framework需要知道对象变动,将先把当前实体与快照中对象进行扫描对比。...变动跟踪代理:变动跟踪代理是一种会主动通知Entity Framework实体对象发生变动机制。:延迟加载实现方式。...大部分实例对象变动调整需要在Entity Framework进行SaveChanges才会知道, 但也可以根据需要调用变动跟踪获取当前对象状态。   ...但有大量实例对象在内存中,或DbContext有大量操作,自动DetectChanges行为可能会一定程度影响性能。...使用AsNoTracking方法查询返回无变动跟踪ProvinceDbSet, 由于是无变动跟踪,所以对返回Province集中数据任何修改, 在SaveChanges(),都不会提交到数据库中

    47120

    EF Core关系配置

    执行实体相关查询原生SQL语句 如果要执行原生SQL是一个查询语句,并且查询结果也能对应一个实体,就可以调用对应实体DbSetFromSqlInterpolated()方法来执行一个查询SQL...foreach(Book b in books.Skip(3).Take(6)) { } 局限性: SQL 查询必须返回实体类型对应数据库表所有列; 结果集中列名必须与属性映射到列名称匹配。...执行SaveChanges()等方法,EF Core将会把存储快照中值与实体的当前值进行比较。...已删除(Deleted):DbContext正在跟踪此实体,并存在于数据库中,但在下次调用 SaveChanges 要从数据库中删除对应数据。...SaveChanges()操作: “已分离”和“未改变”实体SaveChanges()忽略; “已添加”实体SaveChanges() 插入数据库; “已修改”实体SaveChanges(

    10210

    EntityFramework数据持久化复习资料6、EntityFramework引入

    从数据库生成Class,2.由实体类生成数据库表结构,3.通过数据库可视化设计器设计数据库,同时生成实体类。 ORM (对象关系型映射)是将数据存储从域对象自动映射到关系型数据库工具。...这个过程就是通过ORM框架来完成,操作对象就是操作数据库也是通过ORM来完成。ORM框架就是做对象和数据库映射。 那么EntityFramework作用是什么?...我理解就是大大简化数据库操作,举个例子:在没有使用EF前,我们要编写复杂SQL语句,而使用了EF之后,将会减少编写复杂SQL语句过程。...创建测试项目【控制台应用】 项目创建 创建项目名 添加EF完整过程 1、添加类 2、添加【ADO.NET实体数据模型】 选择左侧菜单数据可以快速选择。...使用ASP.NETWeb技术显现出来操作过程,好好练习哈。

    51930

    【One by One系列】IdentityServer4(八)使用EntityFramework Core对数据进行持久化

    且IdentityServer在运行过程中还会生成临时数据,授权码、是否同意按钮选择、以及refresh token。默认情况下,这些也存储在内存中。...,客户端,资源,scope等等 PersistedGrantDbContext - 作用于临时操作数据,授权码,refresh tokens 这些context适用于任何ef core兼容关系型数据库...,随着IdentityServer模型更改,IdentityServer4.EntityFramework.Storage中实体类也将更改,所以需要使用者随着时间推移,升级使用这个包,这个过程,...需要负责在数据库架构以及在实体类更改时,对该数据库架构进行必要更改。...一旦填充数据库初始化数据之后,就可以考虑删除对其之调用。 7.运行客户端应用 这个就简略些,上个命令即可 cd src\IdentityServer dotnet run

    1.1K30

    DDD实战进阶第一波(四):开发一般业务大健康行业直销系统(搭建支持DDD轻量级框架三)

    1.实体、聚合根与值对象顶层体现 实体顶层定义: public interface IEntity { string Code { get; set; } Guid...Id { get; set; } } Id是一个未来存储到数据库表中技术主键,Code是领域对象唯一业务标识符。...你也可以扩展这个接口,定义两个实体比较接口(未来实现就是比较两个实体如果Code一致,则代表两个实体相等)。...在数据库中,值对象可能作为单独表存储,也可以作为实体一部分存储。你也可以扩展这个接口,定义两个值对象比较接口(未来实现 就是比较两个值对象如果所有属性值一致,则代表两个值对象相等)。...方法,其实就是使用了EF CoreDbContext数据访问上下文类SaveChanges()事务提交方法,应用服务层用例就可以获取到某个聚合根的当前状态,然后调用仓储接口Commit方法,实现了整个聚合所有对象一次性事务提交

    1.3K50

    Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库

    Topic.Posts 和 Post.Topic 属性建立了主外键关系,这两个表主键为 Id,且类型为 int ,这表示在下面的创建数据库过程中,EFCore 会自动为这两个实体对象建立关系和主键...,并会自动设置 Id 字段为主键标识 1.3 编写数据库上下文对象,该对象必须继承自 DbContext DbContext 内置了很多个构造函数,这里使用配置选项方式,实现方式也非常简单,最终,在...在 Migrations 文件夹中;执行 Update-Database 命令后,EFCore 设计工具将根据 Migrations 中定义去创建数据库,最终,控制台输出 Done 表示创建完成 ?...从上图中可以看到,数据库创建成功,同时,Forum 数据库中还多了一个表 _EFMigrationsHistory ,该表存储正是我们项目中 Migrations 内容,只有两个字段,对应 20190109031435Forum_v1...(); } } 上面的代码定义了 Get/Post/Put/Delete 接口,这是一个标准 Resetful API ,通过依次调用模拟对数据库 CURD 操作 2.

    1.7K21

    Android Binder实现浅析-Binder驱动

    实体信息到SM时候,请求数据中需要写到Binder实体描述信息,之后进行查询时候就是根据描述信息来获取到对应Binder应用编号。...Binder通信进程都需要打开/dev/binder驱动一次(至多一次) 打开Binder驱动之后,内核会调用驱动程序binder_open方法,该方法内部将会创建binder_proc结构体,内存存储了进程信息以及...接着,数据发送进程需要向数据接收进程传递数据,数据只需要从数据发送进程用户内存空间拷贝到数据发送进程内核内存空间,此时,因为数据发送进程内核内存空间与物理内存进行了映射,而数据接收进程用户内存空间与内核内存空间同时都映射到了同一块物理内存上...Binder在传输数据中表述 虽然Binder实体和Binder引用都在驱动中有不同结构体来标识,但是Client和Server在于Binder进行通信,并不是通过传递这两个结构体来代表不同Binder...Binder表述总结 一个Server进程创建了一个Binder实体之后,这个实体在各个环境中表述情况为 Server进程中Binder称为Binder实体,其应该要继承BBinder类(Native

    91310

    Entity Framework复杂类型属性映射

    Code First发现不能推断出类主键,并且没有通过Data Annotations或Fluent API注册主键,那么该类型将被自动注册为复杂类型。...(); } 一、如何正确使用复杂类型 为避免添加实体报错,应该在实体构造函数中初始化复杂类型; 将制度属性添加到复杂类型中,需进行空值检查; 尽量显式注册复杂类型。...所谓原始值就是从数据库查询出来值,当前值就是实体目前值。入口点是 DbContextEntry方法,返回对象类型是 DbEntityEntry 。...同样,我们也可以通过链式调用获取复杂了类型属性或者设置复杂类型属性: var user = efDbContext.Users.Find(1); var city = efDbContext.Entry...从上面的讲解我们卡一看到,用复杂类型很双,一直用一直爽,但是复杂类型还是有他限制: 不能共享引用:因为没有主键标识,不能被自身实例之外任何对象引用; 没有优雅方式标识空引用:即使查询出数据为空

    67610

    02-EF Core笔记之保存数据

    EF Core通过ChangeTracker跟踪需要写入数据库更改,需要保存数据调用DbContextSaveChanges方法完成保存。...(); } 关联数据 在EF Core中,除了独立模型外,还有与模型关联数据,这部分数据通过独立模型添加到模型中,在SaveChanges将会持久化到数据库中。...级联删除 级联删除是数据库概念,意思是主体被删除,所有依赖该主体项(通过外键关联)也会被自动删除。...EF Core对于提供了更细粒度管理,它允许我们定义删除行为,来控制依赖关系被移除,如何处理关系实体。...(); } SetValues方法将比较两个实体值,并对发生改变属性进行重新赋值,未发生改变值保持不变,生成更新数据库语句也仅更新改变字段。

    1.8K40

    【ASP.NET Core 基础知识】--数据库连接--使用Entity Framework Core进行数据库访问

    每次你修改数据模型并保存这些变更,EF Core 都会创建一个新迁移。 迁移历史记录:迁移历史记录是数据库中存储迁移列表,它记录了应用于数据库每个迁移。...以下是一些可以用来提高EF Core性能优化技巧: 使用正确查询方式:根据查询需求选择合适方法。例如,使用LINQ查询、原生SQL或存储过程。...预加载相关实体:在查询,通过使用Include或Explicit Loading来预加载相关实体,减少多次查询数据库需要。...使用AsNoTracking:不需要跟踪实体状态,可以使用AsNoTracking方法提高性能。 批量操作:使用批处理技术,比如批量插入、更新和删除,以减少数据库交互次数。...使用Find方法:需要获取一个已知主键实体,使用Find方法而不是FirstOrDefault或SingleOrDefault。

    33400

    UnitOfWork知多少

    EF中UOW 每个DbContext类型实例都有一个ChangeTracker用来跟踪记录实体变化。调用SaveChanges,所有的更改将通过事务一次性提交到数据库。...仓储只关注于单一聚合持久化,而业务用例却常常会涉及多个聚合更改,为了确保业务用例一致型,我们需要引入事务管理,而事务管理是应用服务层关注点。我们如何在应用服务层来管理事务呢?借助UOW。...同时,我们注意到Insert、Update、Delete方法都显式调用SaveChanges方法。 至此,我们完成了从实体到聚合再到仓储定义和实现,万事俱备,只欠Uow。 4.5....但这似乎引入了另外一个问题,因为仓储是管理单一聚合,每次做增删改时都显式提交了更改(调用SaveChanges),在处理多个聚合时,就无法利用DbContext进行批量提交了。那该如何是好?...中Insert、Update、Delete方法中显式保存调用_dbContext.SaveChanges();。

    2.3K81

    mvc3_bootstrap和数据库交互

    对于MVC编程,主要应该先了解M(模型)-V(视图)-C(控制器)相关概念,并进而理解相关框架类别及操作方法. 1,ASP.NET MVC框架中路由主要有两种用途: a,匹配传入请求, 并把这些请求映射到控制器操作.... b,构造传出URL,用来响应控制器中操作. 2,在Global.asax.cs文件中, Application_Start方法中调用了一个名为RegisterRoutes方法, 该方法在~/App_Start...OumindBlogEntities db=new OumindBlogEntities();//OumindBlogEntities 为创建实体类型名称. 4.3 创建EF实体类,...db.SaveChanges(); 5.指定页面Model类型类型. 而@Html.TextBoxFor() 则是使用HtmlHelper强类型方法, 从而可以指定使用Model类型....本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    48610
    领券