엔티티 유형 <type>이 (가) 현재 컨텍스트에 대한 모델의 일부가 아닙니다.


146

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>();
    }

}

이 오류가 발생하는 특별한 이유가 있습니까? 도움없이 마이그레이션을 활성화하고 자동 마이그레이션을 활성화했습니다.

답변:


142

이것을 커스텀 DbContext클래스 에 넣으십시오 .

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Estate>().ToTable("Estate");
}

시작시 테이블이 작성되지 않으면 이것이 이유입니다. OnModelCreating 메서드 재정의에서 DbContext에 이에 대해 알려야합니다.

여기에서 사용자 정의 엔티티 별 맵핑을 수행하거나 별도의 EntityTypeConfiguration<T>클래스 로 분리 할 수 있습니다.


1
고마워, 댄-이 문제를 해결합니다. 이제 테이블이 생성되었습니다. 다른 방법은 없습니다. EF는 스스로 할 수 없습니까? [ToTable ( 'Estates')] 또는 이와 유사한 것으로 엔티티에 주석을 달 수 없습니다.
janhartmann

3
OnModelCreating엔티티가와 동일한 어셈블리에있는 경우 재정의하지 않고 작동 할 수 있다고 생각 합니다 DbContext. 엔티티에 데이터 주석을 사용한 적이 없으므로 확실하게 말할 수는 없습니다. OnModelCreating다른 어셈블리에서 엔티티를 찾아서 자동으로 등록 할 수 있도록 Tripod에서 수행하는 어셈블리를 항상 스캔 할 수 있습니다.
danludwig

아 물론 이죠 삼각대를 사용하는 방법에 대한 메모에 감사드립니다. 지금 비슷한 작업을 수행했으며 정상적으로 작동하는 것 같습니다. (또한 github.com/danludwig/Layout3/blob/master/UCosmic.Domain/Api/… 에 대한 귀하의 리플렉션 확장 덕분에 ). 이제 GetType () 어셈블리를 보는 대신 참조 어셈블리를 찾아야합니다. "var assembly = Assembly.Load ("Dimension.Web.Domain ");" is not pretty ;-)
janhartmann

또는 새 / Mapping / 폴더를 도메인 대신 Impl 프로젝트로 옮길 수도 있습니다.
janhartmann

@meep 또는 danludwig. 삼각대에 대해 더 알려 주시거나 링크를 공유해 주시겠습니까?
DkAngelito

73

분명히이 오류는 매우 일반적인 것으로 여러 가지 이유가있을 수 있습니다. 제 경우에는 다음과 같습니다.에 의해 생성 된 연결 문자열 (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


17
내 문제는 연결 문자열에도있었습니다. 데이터 모델의 이름을 바꾸고 t4 템플릿을 다시 가져 왔지만 연결 문자열에서 메타 데이터 (.csdl, .ssdl, .msl 파일)를 업데이트하지 않았습니다. 당신의 대답은 이것을 깨닫게 도와주었습니다. 감사합니다!
Vyskol

4
인증을 위해 ID 모델을 사용하는 경우 2 개의 연결 문자열이 필요합니다. 하나는 "DefaultConnection"으로 이름을 바꾸거나 공용 ApplicationDbContext ()에 넣을 수 없습니다. base ( "IdentityDbContext", throwIfV1Schema : false) {} 이것이 내 오류를 일으켰습니다. 당신처럼 (나는 거기에 EF 문자열이 있음). 두 번째 연결 문자열은 마법사를 사용하여 EF를 추가하여 만든 문자열이며 연결 문자열 매개 변수를 요청합니다. 나는 이것이 누군가를 돕기를 바랍니다.
JustJohn

여기에서도 마찬가지입니다. 매우 실망스러운
Nick Molyneux

1
에서 EF 4.x로 업그레이드 합니다 EF 6. 테이블 ( DatabaseFirst) 을 추가하기 위해 연결 문자열을 다시 생성해야했습니다 . 나는 내 ConnectionString에 있음을 통보하지 않았다 app.config과는 web.config달랐다. 나는를 점령되면 connectionstring으로부터 app.config, 그것은 일하기 시작했다.
DHFW

16

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

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

12

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

단계 :

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

8
EF 코드에는 .edmx가 없습니다.
Tuukka Haapaniemi

비록 그가 (또는이 문제를 가진 다른 누군가) Code First를 다시 생각하고 대신 이런 식으로하고 싶을 수도 있기 때문에 +1을주었습니다.
vapcguy

9

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


이것은 아마도 많은 사람들에게 명백했을 것이지만, 이것은 db-first와 code-first를 혼합하는 것과 관련하여 나의 문제가되었습니다. 이제 바퀴 회전을 멈출 수 있습니다. 감사합니다!
Bonez024

3

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


3

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


이것은 나에게도 일어났다. 다른 곳에서 EF 연결 문자열을 복사했으며 메타 데이터에서 모델 이름을 업데이트하지 않았습니다.
devC

2

연결 문자열로 확인해야 할 또 다른 사항은 모델 이름입니다. DB 우선 두 가지 엔티티 모델을 사용하고있었습니다. 구성에서 하나의 엔티티 연결을 복사하고 이름을 바꾸고 연결 문자열 부분을 변경했습니다. 내가 바꾸지 않은 것은 모델 이름 이었기 때문에 엔터티 모델이 올바르게 생성되었지만 컨텍스트가 시작되었을 때 EF는 엔터티에 대한 잘못된 모델을 찾고있었습니다.

명백하게 기록 된 것처럼 보이지만 다시는 4 시간이 걸립니다.


2

나에게 문제는 Model (.edmx)로 connection string생성 된 것을 사용했다는 것 ADO.Net입니다. 연결 문자열을 변경하면 문제가 해결되었습니다.


1

어떤 이유로 든 오래된 모델 캐시를 사용하는 경우에도 발생할 수 있습니다. 컨텍스트가 DbConfiguration.SetModelStore를 통해 파일 시스템의 EDMX 파일로 캐시 된 경우 캐시 된 버전이 사용될 때 OnModelCreating이 호출되지 않습니다. 결과적으로 캐시 된 저장소에서 엔티티가 누락 된 경우 연결 문자열이 올바르더라도 테이블에 데이터베이스가 있고 엔티티가 DbContext에 올바르게 설정되어 있어도 위의 오류가 발생합니다.


1

메시지는 분명했지만 처음에는받지 못했습니다 ...

두 개의 Entity Framework DB 컨텍스트 sysContextshardContext동일한 방법으로 작업하고 있습니다.

내가 수정 / 업데이트 한 엔티티는 한 컨텍스트에서 왔지만 다음과 같이 다른 컨텍스트에 저장하려고했습니다.

invite.uid = user.uid;

sysContext.Entry(invite).State = EntityState.Modified;

sysContext.SaveChanges(); // Got the exception here

그러나 올바른 버전은 다음과 같아야합니다.

invite.uid = user.uid;

shardContext.Entry(invite).State = EntityState.Modified;

shardContext.SaveChanges();

엔티티를 올바른 컨텍스트로 전달한 후이 오류는 사라졌습니다.


0

분명히 들리지만 유형을 명시 적으로 무시하지 않아야합니다.

modelBuilder.Ignore<MyType>();


0

구성에 추가 된 엔터티의 맵 (빈 항목도 포함)은 엔터티 유형이 컨텍스트의 일부가되도록합니다. 빈 맵으로 수정 된 다른 엔티티와 관계가없는 엔티티가있었습니다.


0

DB를 먼저 시도하는 경우 테이블에 기본 키 가 있는지 확인하십시오.


0

Visual Studio 2019 가이 문제를 일으키는 것으로 보입니다. 2017 년에 edmx 모델을 다시 생성하여 수정했습니다.


0

Entity Framewrok에서 동일한 문제가 발생하고 다음 단계에 따라 해결했습니다.

1-Model.edmx를 엽니 다 .2 테이블 위치 변경 (CS 파일 변경) 3- 저장

당신을 도울 수 있기를 바랍니다


0

.edmx 파일을 삭제하고 다시 추가하십시오. 특히 Entity Framework를 업그레이드 한 경우


0

EntityFrameworkCore와 동일한 문제에 직면하여 다양한 값을 업데이트하려고했습니다.

이 방법은 효과가 없었습니다

  _dbSet.AttachRange(entity);
  _context.Entry(entity).State = EntityState.Modified;
   await _context.SaveChangesAsync().ConfigureAwait(false);

UpdateRange 메소드를 추가하고 첨부 및 항목을 제거하면 모든 것이 작동합니다.

  _dbSet.UpdateRange(entity);
  await _context.SaveChangesAsync().ConfigureAwait(false);

0

나를 위해 엔티티 클래스의 이름을 변경했기 때문에 발생했습니다. 롤백 할 때 Ok였습니다.


0

바보 일 수는 있지만 일부 테이블에서만이 오류가 발생하면 프로젝트를 정리하고 다시 작성하는 것을 잊지 마십시오 (많은 시간을 절약 할 수 있음)


0

나는 이것을 가지고 있었다

using (var context = new ATImporterContext(DBConnection))
{
    if (GetID(entity).Equals(0))
    {
        context.Set<T>().Add(entity);
    }
    else
    {
        int val = GetID(entity);
        var entry = GetEntryAsync(context, GetID(entity)).ConfigureAwait(false);
        context.Entry(entry).CurrentValues.SetValues(entity);

    }
    
    await context.SaveChangesAsync().ConfigureAwait(false);
}

이것은 비동기 메서드에 있었지만 GetEntryAsync 전에 대기하는 것을 잊어 버렸으므로 동일한 오류가 발생했습니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.