Ef core 如何设置主键

Posted 850391642c

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ef core 如何设置主键相关的知识,希望对你有一定的参考价值。

  在正题之前,先说明几个问题。

  (1)写 sql 不好吗,为什么要引入 ORM ?

  总的来说由于需求的复杂性增加,引入了面向对象编程,进而有了 ORM ,ORM 使得开发人员以对象的方式表达业务逻辑。对于有些类 sqlHelper 的 ORM 也不能说好还是不好,可能需求不同吧。

  (2)实体 Entity 为什么要有主键?

  这个是由实体的定义决定的,可标识的对象称之为实体。

  (3)主键的类型有哪些?

  基本可以分为两类:数值型:int、long;字符串类型:guid 或其他。

  主键是数据库对列的约束,具有唯一、非空、不可变的性质。主键的值可以是数据库自增,也可以是程序中设置。

  (4)如何选择主键的类型?

  主键对于数据库的影响主要是:产生的索引的大小、维护数据的成本(可以理解为插入、更新、查找数据的速度)。数值型类型性能优于字符串类型,数值类型的长度小于字符串类型,所以其表达的范围小于字符串。

  Retrieve entity id Before call savechanges?(在调用 savechanges 方法前获取实体 id 的值?)

  如果选择 guid,那么可以在程序中直接生成 guid 的值。如果选择 int 类型,则分以下几种情况:

1 导航属性

       var contxt = new BloggingContext();

            var blog = new Blog()

            {

                Url = "www",

                Rating = 2

            };

            contxt.Blogs.Add(blog);

            var post = new Post() { Blog = blog, Title = "t", Content = "c" };

            contxt.Posts.Add(post);

 

            contxt.SaveChanges();

 

2 HiLo (仅SqlServer支持)

        using (var db = new BloggingContext())

            {

                var blog = new Blog { Url = "http://sample.com" };

                db.Blogs.Add(blog);

                Console.WriteLine(blog.BlogId);

 

                db.SaveChanges();

            }

 

3 transaction

  var contxt = new BloggingContext();

 

            using (var transaction = await contxt.BeginTransactionAsync())

            {

                var blog = new Blog()

                {

                    Url = "www",

                    Rating = 2

                };

 

                contxt.Blogs.Add(blog);

                contxt.SaveChanges();

 

                var blog2 = new Blog()

                {

                    Url = "www" + blog.BlogId,

                    Rating = 2

                };

                contxt.Blogs.Add(blog2);

                contxt.SaveChanges();

 

                await transaction.CommitAsync();

            }

 

参考:

https://docs.microsoft.com/en-us/dotnet/architecture/microservices/

https://vladmihalcea.com/database-primary-key-flavors/

 

以上是关于Ef core 如何设置主键的主要内容,如果未能解决你的问题,请参考以下文章

如何使 EF-Core 使用 Guid 而不是 String 作为其 ID/主键

SQL Server 如何添加删除外键主键,以及更新自增属性

如何使EF Core不插入MySql中自增长的主键(踩坑实录)

数据库—超键候选键主键外键

EF Core:实体类型“用户”需要定义主键

EF6 vs Entity Framework Core:插入实体而不将主键(身份)重置为零