카테고리 보관물: C#

C#

엔티티 유형 <type>이 (가) 현재 컨텍스트에 대한 모델의 일부가 아닙니다. 않습니다. https://genericunitofworkandrepositories.codeplex.com/ 의 코드를 기반으로 일반 리포지토리

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= 
                               &quot;data source=(localdb)\v11.0; 
                               initial catalog=Blogging;
                               integrated security=True; 
                               multipleactiveresultsets=True;&quot;" 
     providerName="System.Data.EntityClient" /> 
</connectionStrings>

그리고 ADO.NET 문자열은 다음과 같습니다 :

<connectionStrings>
  <add name="BlogContext"  
        providerName="System.Data.SqlClient"  
        connectionString="Server=.\SQLEXPRESS;Database=Blogging;
        Integrated Security=True;"/> 
</connectionStrings>

출처 : http://msdn.microsoft.com/nl-nl/data/jj556606.aspx


답변

나에게 문제는 엔티티 프레임 워크의 컨텍스트 내 DB 세트에 엔티티 클래스를 포함시키지 않았다는 것입니다.

public DbSet<ModelName> ModelName { get; set; }


답변

모델에서 테이블을 제거했다가 다시 추가 할 수 있습니다. 솔루션 탐색기에서 .edmx 파일을 열어 시각적으로이를 수행 할 수 있습니다.

단계 :

  1. 솔루션 탐색기에서 .edmx 파일을 두 번 클릭하십시오.
  2. 제거하려는 테이블 헤드를 마우스 오른쪽 버튼으로 클릭하고 “모델에서 삭제”를 선택하십시오.
  3. 작업 영역을 다시 마우스 오른쪽 버튼으로 클릭하고 “데이터베이스에서 모델 업데이트”를 선택하십시오.
  4. 테이블 목록에서 테이블을 다시 추가하십시오.
  5. 솔루션 청소 및 구축

답변

연결 문자열에 문제가있을 수 있습니다. EntityFramework와 관련된 메타 데이터가없는 연결 문자열이 SqlClient 공급자 용인지 확인하십시오.


답변

데이터베이스의 기존 테이블이 코드 우선 모델에 적절하게 매핑되지 않을 때이 오류가 발생했습니다. 특히 데이터베이스 테이블에는 char (1), C #에는 char이있었습니다. 모델을 문자열로 변경하면 문제가 해결되었습니다.


답변

연결 문자열의 메타 데이터 부분을 업데이트하여 문제를 해결했습니다. 분명히 잘못된 .csdl / .ssdl / .msl 참조를 가리키고 있습니다.