Tôi gặp sự cố với Entity Framework trong Asp.net. Tôi muốn nhận giá trị Id bất cứ khi nào tôi thêm một đối tượng vào cơ sở dữ liệu. Tôi có thể làm cái này như thế nào?
SaveChanges
ngay lập tức chỉ để lấy id. Đọc thêm ở đây .
Tôi gặp sự cố với Entity Framework trong Asp.net. Tôi muốn nhận giá trị Id bất cứ khi nào tôi thêm một đối tượng vào cơ sở dữ liệu. Tôi có thể làm cái này như thế nào?
SaveChanges
ngay lập tức chỉ để lấy id. Đọc thêm ở đây .
Câu trả lời:
Nó là khá dễ dàng. Nếu bạn đang sử dụng Id được tạo DB (như IDENTITY
trong MS SQL), bạn chỉ cần thêm thực thể vào ObjectSet
và SaveChanges
liên quan ObjectContext
. Id
sẽ được tự động điền cho bạn:
using (var context = new MyContext())
{
context.MyEntities.Add(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Yes it's here
}
Entity framework theo mặc định sau mỗi INSERT
với SELECT SCOPE_IDENTITY()
khi tự động tạo ra Id
s được sử dụng.
Tôi đã sử dụng câu trả lời của Ladislav Mrnka để lấy thành công Id khi sử dụng Entity Framework tuy nhiên tôi đang đăng ở đây vì tôi đã sử dụng sai (nghĩa là sử dụng nó khi không cần thiết) và nghĩ rằng tôi sẽ đăng những phát hiện của mình ở đây trong- trường hợp mọi người đang tìm cách "giải quyết" vấn đề tôi gặp phải.
Xem xét một đối tượng Đặt hàng có mối quan hệ khóa ngoài với Khách hàng. Khi tôi thêm một khách hàng mới và một đơn đặt hàng mới cùng lúc tôi đang làm một cái gì đó như thế này;
var customer = new Customer(); //no Id yet;
var order = new Order(); //requires Customer.Id to link it to customer;
context.Customers.Add(customer);
context.SaveChanges();//this generates the Id for customer
order.CustomerId = customer.Id;//finally I can set the Id
Tuy nhiên trong trường hợp của tôi, điều này là không bắt buộc vì tôi có mối quan hệ khóa ngoại giữa khách hàng. Tôi và đặt hàng. Khách hàng
Tất cả tôi phải làm là điều này;
var customer = new Customer(); //no Id yet;
var order = new Order{Customer = customer};
context.SaveChanges();//adds customer.Id to customer and the correct CustomerId to order
Bây giờ khi tôi lưu các thay đổi, id được tạo cho khách hàng cũng được thêm vào đơn đặt hàng. Tôi không cần các bước bổ sung
Tôi biết điều này không trả lời câu hỏi ban đầu nhưng nghĩ rằng nó có thể giúp các nhà phát triển mới đối với EF không sử dụng quá nhiều câu trả lời được bình chọn hàng đầu cho những điều không cần thiết.
Điều này cũng có nghĩa là các bản cập nhật hoàn tất trong một giao dịch, có khả năng tránh dữ liệu orphin (tất cả các bản cập nhật đã hoàn thành hoặc không có bản cập nhật nào).
Bạn cần tải lại thực thể sau khi lưu thay đổi. Bởi vì nó đã bị thay đổi bởi một trình kích hoạt cơ sở dữ liệu không thể được theo dõi bởi EF. Vì vậy, chúng ta cần tải lại thực thể từ DB,
db.Entry(MyNewObject).GetDatabaseValues();
Sau đó
int id = myNewObject.Id;
Nhìn vào câu trả lời @jayantha trong câu hỏi dưới đây:
Tìm câu trả lời @christian trong câu hỏi dưới đây cũng có thể giúp:
.GetDatabaseValues();
nếu bạn vừa lưu mô hình của mình vào DB. ID sẽ tự động lặp lại mô hình.
GetDatabaseValues()
nếu nó không biết ID của đối tượng cần tìm trong cơ sở dữ liệu?
Vui lòng tham khảo liên kết này.
http://www.ladislavmrnka.com/2011/03/the-orms-in-storegeneratedpotype-fixed-in-vs-2010-sp1/
Bạn phải đặt thuộc tính của StoreGeneratedPotype để nhận dạng và sau đó thử mã của riêng bạn.
Hoặc nếu không bạn cũng có thể sử dụng này.
using (var context = new MyContext())
{
context.MyEntities.AddObject(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Your Identity column ID
}
StoreGeneratedPattern
là mảnh còn thiếu cho tôi.
Bạn chỉ có thể nhận ID sau khi lưu, thay vào đó bạn có thể tạo Hướng dẫn mới và gán trước khi lưu.
Tôi gặp một tình huống mà tôi cần chèn dữ liệu vào cơ sở dữ liệu & đồng thời yêu cầu id chính sử dụng khung thực thể. Giải pháp :
long id;
IGenericQueryRepository<myentityclass, Entityname> InfoBase = null;
try
{
InfoBase = new GenericQueryRepository<myentityclass, Entityname>();
InfoBase.Add(generalinfo);
InfoBase.Context.SaveChanges();
id = entityclassobj.ID;
return id;
}
Tất cả các câu trả lời đều rất phù hợp với kịch bản của riêng họ, điều tôi đã làm khác là tôi đã gán int PK trực tiếp từ đối tượng (TEntity) mà Add () trả về một biến int như thế này;
using (Entities entities = new Entities())
{
int employeeId = entities.Employee.Add(new Employee
{
EmployeeName = employeeComplexModel.EmployeeName,
EmployeeCreatedDate = DateTime.Now,
EmployeeUpdatedDate = DateTime.Now,
EmployeeStatus = true
}).EmployeeId;
//...use id for other work
}
Vì vậy, thay vì tạo một đối tượng hoàn toàn mới, bạn chỉ cần lấy những gì bạn muốn :)
EDIT cho ông @GertArnold:
Add
(nếu điều này DbSet.Add
) không kỳ diệu gán một giá trị cho EmployeeId
.
SaveChanges
. Không thể nào. Trừ khi bạn có một số quy trình khác được gán EmployeeId
, ví dụ như trong hàm tạo Employee
của. HOẶC bạn đang sử dụng lõi EF ForSqlServerUseSequenceHiLo
. Dù sao, bạn không đưa ra toàn bộ hình ảnh.
Repository.addorupdate(entity, entity.id);
Repository.savechanges();
Var id = entity.id;
Điều này sẽ làm việc.
Repository
là gì . Và "điều này sẽ làm việc" là một số lời giải thích!.
Có hai chiến lược:
Sử dụng cơ sở dữ liệu được tạo ID
( int
hoặc GUID
)
Nhược điểm:
Bạn nên thực hiện SaveChanges()
để có được các ID
thực thể vừa lưu.
Ưu điểm:
Có thể sử dụng int
danh tính.
Sử dụng ứng dụng khách được tạo ID
- chỉ GUID.
Ưu điểm: Giảm thiểu SaveChanges
hoạt động. Có thể chèn một đồ thị lớn của các đối tượng mới mỗi một thao tác.
Nhược điểm:
Chỉ được phép cho GUID
Khi bạn sử dụng mã EF 6.x trước tiên
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
và khởi tạo một bảng cơ sở dữ liệu, nó sẽ đặt một
(newsequentialid())
bên trong các thuộc tính bảng dưới tiêu đề Giá trị mặc định hoặc liên kết, cho phép ID được điền khi được chèn.
Vấn đề là nếu bạn tạo một bảng và thêm
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
phần sau, tương lai update-cơ sở dữ liệu sẽ không thêm phía sau (newsequentialid ())
Để khắc phục cách thích hợp là xóa sạch di chuyển, xóa cơ sở dữ liệu và di chuyển lại ... hoặc bạn chỉ có thể thêm (new resultentialid ()) vào trình thiết kế bảng.
when -column- is NULL, then NEWID()