0

저는 코드 패러다임을 처음 접했으므로 저와 함께하시기 바랍니다. 내 엔티티 클래스에서 내 데이터베이스에 만들어진 프리미티브 또는 사용자 정의 클래스의 컬렉션/목록/배열을 가져올 수 없습니다. 결과적으로 테이블을 올바르게 시드 할 수 없습니다. 오류가 없으면 내 컬렉션을 제외한 모든 속성이있는 엔티티 테이블을 가져옵니다. 저는 EF5, VS2010, MVC4 및 SqlExpress를 사용하고 있습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?Entity Framework 5 : 코드를 사용하여 컬렉션 만들기 처음으로

내 엔티티 클래스 :

public class MyEntity 
{  
    public int MyEntityID { get; set; } // GOOD 
    public string Property1 { get; set; } // GOOD 
    public bool Property2 { get; set; } // GOOD 
    public IList<CustomClass> CustomClassList { get; set; } //BAD, NOT CREATED ON DB 
    public CustomClass[] CustomClassArray { get; set; } //BAD, NOT CREATED ON DB 
} 

내 사용자 정의 클래스 :

[ComplexType] 
public class CustomClass 
{ 
    public string Title { get; set; } 
} 

내 구성/마이그레이션 클래스

public class Configuration : DbMigrationsConfiguration<MyContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
     AutomaticMigrationDataLossAllowed = true; 
    } 

    protected override void Seed(MyContext context) 
    { 
     context.MyEntity.AddOrUpdate(x => x.MyEntityID, 
      new MyEntity() 
      { 
       Property1 = "abc", 
       Property2 = "xyz", 
       CustomClassList = new List<CustomClass> {new CustomClass{Title="Help"}} 
      } 
     context.SaveChanges();  
    } 
} 
가 이
<!--NO LUCK--> 
<add name="DefaultConnection" connectionString="Data Source=.\SQLEXPRESS2;Initial Catalog=TESTDB_2;Integrated Security=SSPI" providerName="System.Data.SqlClient" /> 
<!--NO LUCK--> 
<add name="DefaultConnection" connectionString="Data Source=.\SQLEXPRESS2;Initial Catalog=TESTDB_3;Integrated Security=SSPI" providerName="System.Data.SqlClient" /> 
+0

마이그레이션에 도움이되지 않지만 컬렉션은 'ICollection <>'으로 선언되어야합니다. 'public ICollection CustomClassList {get; 세트; }' – qujck

답변

2

법인 Framwork은 원시의 컬렉션을 지원하지 않습니다 : 나는 새 데이터베이스를 만들려고 할 때내 Global.asax.cs 위해 Application_Start() 메소드는

protected void Application_Start() 
{ 
    WebApiConfig.Register(GlobalConfiguration.Configuration); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 
    AuthConfig.RegisterAuth(); 
    SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>()); 
} 

, 나도 같은 결과를 얻을 수 또는 복합 유형. 컬렉션을 원한다면 엔티티 집합이어야합니다 (즉, 키 속성이 있어야 함). 가장 간단한 경우 엔 별도의 테이블로 모델링되고 필요에 따라 적절한 외래 키가 생성됩니다 (관계의 카디널리티에 따라 다름). CustomClass는 엔티티가 아니고 콜렉션에서 사용되기 때문에 무시됩니다 (엔티티 유형 모음이 아니므로 무시됩니다). 배열을 다시 할당하지 않고 항목을 추가/제거 할 수 없기 때문에 배열이 전혀 지원되지 않으므로 CustomClassArray가 무시됩니다.

+0

응답 해 주셔서 감사합니다. 필자는 Julie Lerman의 기사를 살펴 봤으며 ComplexTypes 컬렉션을 가지고 있습니다 - http://msdn.microsoft.com/en-us/data/jj591583.aspx. 아마 내가 그녀를 오해하고있는 걸까요? –

+0

이들은 엔티티이며 복합 유형이 아닙니다. 자세한 내용은 http://msdn.microsoft.com/en-us/library/ee382831.aspx를 참조하십시오. 복잡한 유형은 프리미티브 (프리미티브 또는 복합) 속성의 모음입니다 (표준 예제는 주소 복합 유형입니다). 속성을 그룹화하기 위해 엔티티에서 복잡한 유형의 속성을 만들 수 있지만 표의 열로 모델링됩니다 (평평하게 생각 함) . 이들은 주요 속성을 가질 수없고 복잡한 유형의 컬렉션을 가질 수 없습니다 (그렇지 않으면 속성을 그룹화하는 수단 일 뿐이므로 데이터베이스에서이 모델을 어떻게 모델링합니까?). – Pawel

+0

좋은 설명. 그렇다면 필자의 예제는 복잡한 유형의 세계에서 작동하지 않는 이유는 무엇입니까? 해야하는 것처럼 보입니다. 내 예제에 키를 추가했는데 다른 테이블을 만들었지 만 MyEntity 테이블에는 필드 (foriegn 키?)가 없습니다. 또한 새 테이블은 시드되지 않습니다. 어떤 아이디어? –

관련 문제