Entity Framework에 들어가고 있지만 코드 우선 접근 방식에서 중요한 점이 누락되었는지 확실하지 않습니다.
https://genericunitofworkandrepositories.codeplex.com/ 의 코드를 기반으로 일반 리포지토리 패턴을 사용 하고 있으며 엔터티를 만들었습니다.
그러나 엔터티에 액세스하거나 수정하려고하면 다음과 같은 문제가 발생합니다.
System.InvalidOperationException : 항목 유형 Estate가 현재 컨텍스트에 대한 모델의 일부가 아닙니다.
내 저장소에서 액세스하려고 할 때 발생합니다.
public virtual void Insert(TEntity entity)
{
((IObjectState)entity).ObjectState = ObjectState.Added;
_dbSet.Attach(entity); // <-- The error occurs here
_context.SyncObjectState(entity);
}
데이터베이스 (./SQLEXPRESS)는 정상적으로 작성되지만 엔티티 (테이블)는 시작시 작성되지 않습니다.
엔티티의 맵핑을 명시 적으로 설정해야하는지 궁금합니다. EF는 독자적으로 이것을 할 수 없습니까?
나의 실체는 :
public class Estate : EntityBase
{
public int EstateId { get; set; }
public string Name { get; set; }
}
내 맥락은 다음과 같습니다.
public partial class DimensionWebDbContext : DbContextBase // DbContextBase inherits DbContext
{
public DimensionWebDbContext() :
base("DimensionWebContext")
{
Database.SetInitializer<DimensionWebDbContext>(new CreateDatabaseIfNotExists<DimensionWebDbContext>());
Configuration.ProxyCreationEnabled = false;
}
public new IDbSet<T> Set<T>() where T : class
{
return base.Set<T>();
}
}
이 오류가 발생하는 특별한 이유가 있습니까? 도움없이 마이그레이션을 활성화하고 자동 마이그레이션을 활성화했습니다.
답변
이것을 커스텀 DbContext
클래스 에 넣으십시오 .
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Estate>().ToTable("Estate");
}
시작시 테이블이 작성되지 않으면 이것이 이유입니다. OnModelCreating 메서드 재정의에서 DbContext에 이에 대해 알려야합니다.
여기에서 사용자 정의 엔티티 별 맵핑을 수행하거나 별도의 EntityTypeConfiguration<T>
클래스 로 분리 할 수 있습니다.
답변
분명히이 오류는 매우 일반적인 것으로 여러 가지 이유가있을 수 있습니다. 제 경우에는 다음과 같습니다.에 의해 생성 된 연결 문자열 (Web.config) .edmx
이 잘못되었습니다. 거의 모든 것을 시도한 후 연결 문자열을 EF 문자열에서 ADO.NET 문자열로 변경했습니다. 이것은 내 문제를 해결했습니다.
예를 들어 EF 문자열은 다음과 같습니다.
<connectionStrings>
<add name="BlogContext"
connectionString="metadata=res://*/BloggingModel.csdl|
res://*/BloggingModel.ssdl|
res://*/BloggingModel.msl;
provider=System.Data.SqlClient
provider connection string=
"data source=(localdb)\v11.0;
initial catalog=Blogging;
integrated security=True;
multipleactiveresultsets=True;""
providerName="System.Data.EntityClient" />
</connectionStrings>
그리고 ADO.NET 문자열은 다음과 같습니다 :
<connectionStrings>
<add name="BlogContext"
providerName="System.Data.SqlClient"
connectionString="Server=.\SQLEXPRESS;Database=Blogging;
Integrated Security=True;"/>
</connectionStrings>
답변
나에게 문제는 엔티티 프레임 워크의 컨텍스트 내 DB 세트에 엔티티 클래스를 포함시키지 않았다는 것입니다.
public DbSet<ModelName> ModelName { get; set; }
답변
모델에서 테이블을 제거했다가 다시 추가 할 수 있습니다. 솔루션 탐색기에서 .edmx 파일을 열어 시각적으로이를 수행 할 수 있습니다.
단계 :
- 솔루션 탐색기에서 .edmx 파일을 두 번 클릭하십시오.
- 제거하려는 테이블 헤드를 마우스 오른쪽 버튼으로 클릭하고 “모델에서 삭제”를 선택하십시오.
- 작업 영역을 다시 마우스 오른쪽 버튼으로 클릭하고 “데이터베이스에서 모델 업데이트”를 선택하십시오.
- 테이블 목록에서 테이블을 다시 추가하십시오.
- 솔루션 청소 및 구축
답변
연결 문자열에 문제가있을 수 있습니다. EntityFramework와 관련된 메타 데이터가없는 연결 문자열이 SqlClient 공급자 용인지 확인하십시오.
답변
데이터베이스의 기존 테이블이 코드 우선 모델에 적절하게 매핑되지 않을 때이 오류가 발생했습니다. 특히 데이터베이스 테이블에는 char (1), C #에는 char이있었습니다. 모델을 문자열로 변경하면 문제가 해결되었습니다.
답변
연결 문자열의 메타 데이터 부분을 업데이트하여 문제를 해결했습니다. 분명히 잘못된 .csdl / .ssdl / .msl 참조를 가리키고 있습니다.