2011-11-15 3 views
4

런타임시 테이블을 SQLCe 데이터베이스에 추가하고자합니다. 이는 테이블 이름이 정적이 아니며 컴파일 타임에 알려지지 않았기 때문입니다. 다음과 같이 내가 엔티티 프레임 워크 4.1 DbContext이 작업을 수행하려고 :C# EF 4.1 DbContext 내에서 테이블을 동적으로 작성하십시오.

public class PersonContext : DbContext 
{ 
    public PersonContext() 
     : base("UnicornsCEDatabase") 
    { 
    } 
} 
public class Person 
{ 
    public int NameId { get; set; } 
    public string Name { get; set; } 
} 
public class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var db = new PersonContext()) 
     { 
      db.Database.Delete(); 

      //Try to create table 
      DbSet per = db.Set<Person>(); 
      var per1 = new Person { NameId = 1, Name = "James"}; 
      per.Add(per1); 
      int recordsAffected = db.SaveChanges(); 

      Console.WriteLine(
       "Saved {0} entities to the database, press any key to exit.", 
       recordsAffected); 
      Console.ReadKey(); 
     } 
    } 
} 

하면이 오류가 발생합니다 이것을 실행하려고 할 때 : 엔티티 타입의 사람은 현재 컨텍스트의 모델의 일부가 아닙니다.

(해당 스키마가있는) 데이터베이스에 DbSet을 정의하지 않고 DbContext 에 런타임시 DbSet을 추가 할 수 있습니까?

DbContext를 Person으로 정적으로 정의 할 때 EF는 전체 데이터베이스와 테이블을 즉석에서 작성합니다. 예를 들어

:

foreach (var item in collection) 
{ 
    string tableName = "PersonTable_"+item.Name; 
    //Add a table with the name tableName to DbContext 
} 

은 EF이 어떻게 든 가능 아니면 다른 어떤 방법으로이를 작성해야합니까?

감사합니다, 위르겐

+0

이 문제가 해결 되었습니까? –

답변

1

그럴 수 모델이 변경 될 때 그것은 DB를 줄어들 기 때문에이 테이블을 만들거나이 생산에서 일한다면 물론, 필요하지 말라고을 업데이트 다음을 사용

Database.SetInitializer<DataContext>(
       new DropCreateDatabaseIfModelChanges<DataContext>()); 

또는 System.Data.Entity.IDatabaseInitializer 인터페이스의 사용자 고유 구현을 만들 수있는 경우

+0

Thx,하지만이 방법으로는 문제가 해결되지 않습니다. ER 팀은 현재 동적 모델을 연구 중입니다. 그래서 나는 인내심을 갖고 DB를 재 설계해야한다. – Juergen

1

Entity Framework는 테이블의 동적 생성을 지원하지 않습니다. 따라서 Code-First를 사용하는 경우 해당 테이블을 만들려면 DbContext에서 DbSets를 정의해야합니다.

http://entityframework.codeplex.com/discussions/448452

이 질문에

Entity Framework (Code First) - Dynamically Building a Model

처럼 거기에 몇 가지 해결 방법이 있습니다 그러나 EF가에 가장 적합한 ORM 아니라, (이 경량 ORM의) ServiceStack.OrmLite을 시도해보십시오.

0
namespace ConsoleApplication31 
{ 
    public class PersonContext : DbContext 
    { 
     public PersonContext() : base("UnicornsCEDatabase") 
     { 
     } 
     public DbSet<Person> Persons { get; set; } 
    } 
    public class Person 
    { 
     public int PersonId { get; set; } 
     public int NameId { get; set; } 
     public string Name { get; set; } 
    } 

    public class Program 
     { 
      static void Main(string[] args) 
      { 
       using (var db = new PersonContext()) 
       { 
        db.Database.Delete(); 

        //Try to create table 
        DbSet per = db.Set<Person>(); 
        var per1 = new Person { NameId = 1, Name = "James" }; 
        per.Add(per1); 
        int recordsAffected = db.SaveChanges(); 

        Console.WriteLine(
         "Saved {0} entities to the database, press any key to exit.", 
         recordsAffected); 
        Console.ReadKey(); 
       } 
      } 
     } 

} 
관련 문제