Asp.net의 Entity Framework에 문제가 있습니다. 데이터베이스에 객체를 추가 할 때마다 ID 값을 얻고 싶습니다. 어떻게해야합니까?
SaveChanges
하면 ID를 얻기 위해 즉시 전화하는 것에 대해 신경 쓸 필요가 없습니다 . 자세한 내용은 여기를 참조하십시오 .
Asp.net의 Entity Framework에 문제가 있습니다. 데이터베이스에 객체를 추가 할 때마다 ID 값을 얻고 싶습니다. 어떻게해야합니까?
SaveChanges
하면 ID를 얻기 위해 즉시 전화하는 것에 대해 신경 쓸 필요가 없습니다 . 자세한 내용은 여기를 참조하십시오 .
답변:
꽤 쉽습니다. 당신이 사용하는 경우 DB는 (같은 ID를 생성 IDENTITY
당신은 단지에 개체를 추가 할 필요가 MS SQL 인치) ObjectSet
와 SaveChanges
관련에ObjectContext
. Id
자동으로 채워집니다 :
using (var context = new MyContext())
{
context.MyEntities.Add(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Yes it's here
}
기본적으로 엔티티 프레임 워크는 자동 생성 이 사용될 때 각각 INSERT
을 따릅니다 .SELECT SCOPE_IDENTITY()
Id
나는 Ladislav Mrnka의 대답을 사용하고 있었다 내가 있었다 때문에 내가 여기에 게시하고 그러나 엔티티 프레임 워크를 사용하는 경우 ID를 검색 성공적으로 미스 - 사용 (즉이 필요하지 않은 그것을 사용)을하고 난 인 - 여기 내 결과를 게시 줄 알았는데 사람들은 내가 가진 문제를 "해결"하려고합니다.
고객과 외래 키 관계가있는 주문 오브젝트를 고려하십시오. 새로운 고객과 새로운 주문을 동시에 추가했을 때 이와 같은 일을하고있었습니다.
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
그러나 내 경우에는 customer.Id와 order.CustomerId 사이에 외래 키 관계가 있기 때문에 필요하지 않았습니다.
내가해야 할 일은 이것뿐입니다.
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
이제 변경 사항을 저장하면 고객에 대해 생성 된 ID도 주문에 추가됩니다. 추가 단계가 필요 없습니다
나는 이것이 원래의 질문에 답하지는 않는다는 것을 알고 있지만 EF를 처음 접하는 개발자는 필요하지 않은 것에 대해 최고 투표 답변을 과도하게 사용하는 데 도움이 될 수 있다고 생각했습니다.
이는 단일 트랜잭션에서 업데이트가 완료되어 orphin 데이터를 피할 수 있음을 의미합니다 (모든 업데이트가 완료되거나 완료되지 않음).
변경 사항을 저장 한 후 엔터티를 다시로드해야합니다. EF로 추적 할 수없는 데이터베이스 트리거에 의해 변경 되었기 때문입니다. 따라서 우리는 DB에서 엔티티를 다시로드해야합니다.
db.Entry(MyNewObject).GetDatabaseValues();
그때
int id = myNewObject.Id;
아래 질문에서 @jayantha 답변을보십시오.
defaultValue를 사용할 때 엔티티 프레임 워크에서 삽입 된 엔티티의 ID를 어떻게 얻을 수 있습니까?
아래 질문에서 @christian 답변을 찾는 것도 도움이 될 수 있습니다.
.GetDatabaseValues();
방금 모델을 DB에 저장 한 경우 에는 할 필요가 없습니다 . ID가 모델에 자동으로 다시 채워 져야합니다.
GetDatabaseValues()
데이터베이스에서 찾을 객체의 ID를 모르는 경우 어떻게 할 수 있습니까?
이 링크를 참조하십시오.
http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/
StoreGeneratedPattern의 속성을 identity로 설정 한 다음 고유 코드를 시도해야합니다.
그렇지 않으면 이것을 사용할 수도 있습니다.
using (var context = new MyContext())
{
context.MyEntities.AddObject(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Your Identity column ID
}
StoreGeneratedPattern
나를 위해 빠진 조각이었다.
저장 한 후에 만 ID를 얻을 수 있으며 대신 새로운 Guid를 생성하고 저장하기 전에 할당 할 수 있습니다.
데이터베이스에 데이터를 삽입 해야하는 동시에 엔티티 프레임 워크를 사용하여 기본 ID가 필요한 상황이 발생합니다. 해결책 :
long id;
IGenericQueryRepository<myentityclass, Entityname> InfoBase = null;
try
{
InfoBase = new GenericQueryRepository<myentityclass, Entityname>();
InfoBase.Add(generalinfo);
InfoBase.Context.SaveChanges();
id = entityclassobj.ID;
return id;
}
모든 답변은 자체 시나리오에 매우 적합합니다. 내가 다른 것은 Add ()가 int 변수에 반환 된 객체 (TEntity)에서 직접 int PK를 할당한다는 것입니다.
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
}
따라서 전체 새 객체를 만드는 대신 원하는 것을 가져옵니다. :)
Mr. @GertArnold에 대한 편집 :
Add
(이것이라면 DbSet.Add
) 마술처럼 값을 할당 하지 않는다는 것 EmployeeId
입니다.
SaveChanges
. 불가능한. EmployeeId
예를 들어 Employee
의 생성자 에서 를 할당하는 다른 프로세스가없는 한 . 또는을 사용하여 EF 코어에 ForSqlServerUseSequenceHiLo
있습니다. 어쨌든, 당신은 전체 그림을 제공하지 않습니다.
Repository.addorupdate(entity, entity.id);
Repository.savechanges();
Var id = entity.id;
작동합니다.
Repository
는 확실하지 않습니다 . 그리고 "이것은 효과가있다"는 설명이다!.
EF 6.x 코드를 먼저 사용하는 경우
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
데이터베이스 테이블을 초기화하면
(newsequentialid())
헤더의 Default Value 또는 Binding 아래에있는 테이블 속성에서 ID를 삽입 할 때 채워질 수 있습니다.
문제는 테이블을 생성하고 테이블을 추가하면
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
나중에, 향후 업데이트 데이터베이스는 (newsequentialid ())를 다시 추가하지 않습니다.
올바른 방법을 수정하려면 마이그레이션을 지우고 데이터베이스를 삭제 한 후 다시 마이그레이션하십시오 ... 또는 테이블 디자이너에 (newsequentialid ())를 추가하면됩니다.
when -column- is NULL, then NEWID()