在正題之前,先說明幾個問題。
(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/