ef设置非自增长id_Ef core 如何设置主键

本文介绍了在 Ef Core 中如何设置非自增长的主键,探讨了为何使用ORM,实体为何需要主键以及主键的类型选择。提供了通过导航属性、HiLo策略和事务处理等方式在程序中生成并设置主键的示例。
摘要由CSDN通过智能技术生成

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

(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();

}

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值