2011-10-20 2 views
1

다른 ID가있는 데이터베이스로 데이터를 가져올 때 ID가 다시 만들어지는 문제가 있습니다. 모든 데이터가 올바르게 가져 오기 때문에 ID (ID 열)가 가져 오기 항목이어야합니다.ID 일시 중지 - Entity Framework 4.1 코드 우선

이 모델에는 두 개의 키가 있습니다. ID 및 신원. ID는 기본적으로 다른 데이터 소스의 고유 한 인스턴스 이름이므로 고유 한 조합이 만들어집니다.

 modelBuilder.Entity<Observation>().HasKey(m => new {m.Instance, m.Id}); 
     modelBuilder.Entity<Observation>().Property(m => m.Id).HasDatabaseGeneratedOption(
      DatabaseGeneratedOption.Identity); 

클래스는 다음과 같습니다 :

모든 클래스 DbContext에서입니다 DatabaseContext에 OnModelCreating를 통해 설정됩니다

데이터베이스 컨텍스트는이 ASP 한 번 만들어
public class Observation 
{ 
    public string Instance { get; set; } 
    public int Id { get; set; } 
    ... 
} 

Ninject .Net MVC 3 응용 프로그램.

나는 새 항목을 추가하는 동안 정체성을 설정하는 SQL 명령을 사용하여 시도하지만 성공 :

CREATE TABLE [dbo].[Observations](
[Instance] [nvarchar](128) NOT NULL, 
[Id] [int] IDENTITY(1,1) NOT NULL, 
    ... 
PRIMARY KEY CLUSTERED 
(
[Instance] ASC, 
[Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

하나를 : 생성 된 테이블 구조는 MSSQL에서 다음과 같습니다

public void SetIdentiyObservation(bool isOn) 
    { 
     var state = isOn ? "ON" : "OFF"; 
     _context.Database.SqlQuery<Observation>("SET IDENTITY_INSERT Observation @state", new SqlParameter("state", state)); 
    } 

이것에 대한 도움을 주시면 감사하겠습니다 :)

답변

0

입력 해 주셔서 감사합니다. 기본으로 돌아가서 데이터베이스 요구 사항에서 고객 요구를 제거하여 해결했습니다. instance + id에 대한 고객 요구 사항을 저장하는 열로 끝나면 데이터베이스는 내부 ID로 자체 수명을 살 수 있습니다.

0

SqlQuery<T>IEnumerable을 반환하며 열거하기 전까지는 sql 쿼리가 실행되지 않습니다. 성명 끝에 .ToList()을 추가하면 구문이 잘못되었다는 예외가 생깁니다. 또한 EF가 결과를 Observation에 매핑하려고 할 때 문제가 발생합니다.

는 드디어 다음이 사용 실행 얻을 수있었습니다 : 내가 해결할 수있는 마지막 문제에지도

_context.Database.SqlQuery<object>("SET IDENTITY_INSERT Observation " + (isOn ? "ON" : "OFF")).ToList(); 

. Id은 데이터베이스에서 생성 된 것으로 표시되었으므로 EF는 해당 값을 INSERT 문에 포함시키지 않습니다.

런타임에 값을 Id으로 변경하는 방법을 찾을 수있는 경우 컨텍스트를 사용하여 엔티티를 추가 할 수 있습니다. 불행히도이 작업을 수행하는 방법을 모르겠습니다. 지정한 Id 행을 삽입 할 수있는 유일한 방법은 기본 연결을 사용하고 필요한 SQL을 실행하는 것입니다.

관련 문제