2011-05-15 9 views
20

그래서 MVC3과 EF4를 배우고 있습니다. 코드 첫 번째 방법을 시도했지만 너무 혼란 스러웠습니다. 클래스를 아무 문제없이 만들 수 있지만 외래 키 및 서로 간의 관계를 처리 할 때는 어려운 부분이 있습니다.Model First 접근법을 사용할 때 데이터를 시드하는 방법은 무엇입니까?

하지만 먼저 모델을 살펴 보았습니다. 이렇게하면 시각적으로 디자인하고 관계가 어디에 있는지 알 수 있습니다.

내 모델을 만든 후에 SQL Express 데이터베이스에 대해 실행하는 SQL을 만듭니다. 완료하고 완료하십시오.

이제 테이블에 데이터가 필요합니다. 물론 서버 탐색기를 사용하여 추가 할 수는 있지만 대부분의 경우 모델을 변경하게 될 것입니다. 그리고 데이터베이스를 계속 업데이트하십시오. 따라서 수동으로 데이터를 입력 할 수 없습니다. 코드를 먼저 사용하면 DropCreateDatabaseIfModelChanges을 파생시키고 seed 메서드를 재정의 할 수 있습니다.

그러나 모델 첫 번째 방법으로 어떻게해야합니까? 그래서 지금 무엇을

protected void Application_Start() 
{ 
    Database.SetInitializer<BettingContext>(new DatabaseInitializer()); 
    AreaRegistration.RegisterAllAreas(); 

    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
} 

:

public class DatabaseInitializer : IDatabaseInitializer<BettingContext> { 
    public void InitializeDatabase(BettingContext context) { 
     var teams = new List<Team> { 
      new Team { Name="Toronto Maple Leafs", League="NHL"}, 
      new Team { Name="Boston Bruins", League="NHL"}, 
      new Team { Name="Vancouver Canucks", League="NHL"}, 
      new Team { Name="Nashville Predators", League="NHL"}, 
      new Team { Name="Montreal Canadiens", League="NHL"}, 
     }; 
    } 
} 
물론

내 글로벌 파일 : 나는 다음과 같은 코드가? 메소드를 실행하려면 어떻게해야합니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까? 당신이 (첫 번째 클래스 모델을 사용하여) DbSets을 만드는 시도 할 수 있습니다, 귀하의 경우에는

Database.SetInitializer(new MySeedData()); 

수동으로 : 다음

public class MySeedData : DropCreateDatabaseIfModelChanges<YourDataBaseContextClass> 
{ 
    protected override void Seed(YourDataBaseContextClass context) 
    { 
     // Create objects here and add them to your context DBSets... 

    } 
} 

public class YourDataBaseContextClass : DbContext 
{ 


} 

, Application_Start() 이내에 전화 :

답변

6

이 뭔가를 할 수 있습니다 위 코드를 사용하여 연결을 시도하십시오. 그것은 Model First + Code First를 혼합 한 것입니다.

public class FourthCoffeeWebContext : DbContext 
{ 
    public DbSet<Category> Categories { get; set; } 
    public DbSet<Product> Products { get; set; } 
} 

이에 추가 : 당신이 그것에 최선을 다하고 당신이 실제로 모델에서 데이터베이스를 생성하기로 CreateDatabaseIfNotExists<(Of <(<'TContext>)>)>

+1

코드 우선 대신 모델 첫 번째 방법을 사용해도이 작업을 수행 할 수 있습니까? – masfenix

+0

@masfenix : 아마도 ... –

+2

이것은 전혀 작동하지 않습니다. ( – masfenix

13

모델은 첫 번째 코드 먼저 크게 다르다. SQL을 생성하여 데이터베이스를 생성하고 수동으로 실행하기 때문에 시드 데이터로이 SQL 스크립트를 계속 유지하는 것이 논리적 인 것으로 나타났습니다.

모델을 변경하면 SQL 스크립트가 업데이트되고 물론 씨앗 SQL 스크립트 (데이터베이스 작성 스크립트 바로 옆에 편리하게 위치)를 검토해야합니다.

이 접근 방식은 지금까지 제대로 작동했으며 '이 데이터 로더가 어디에 있으며 어떻게 빈 데이터베이스를 식별 할 수 있습니까?'라는 혼란을 일으키지 않습니다. (나는 또한 씨앗 데이터와 데이터베이스를 만들기 위해 내 사용자 지정 작업에 대한 내 설치 프로젝트에이 두 SQL 스크립트를 포함 할 수 있습니다.)

0

을 나는 다음과 같은 시드 컨트롤러 사용 후 다음

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using MyProject.Models; 

namespace MyProject.Controllers 
{ 
    public class SeedController : Controller 
    { 
     public string Index() 
     { 
      ContactDBContext db = new Models.ContactDBContext(); 

      Person person = new Person(); 
      person.FullName = "Mr Test"; 
      person.Notes = "It's me!"; 
      db.People.Add(person); 
      db.SaveChanges(); 
      return "Seeding complete."; 
     } 
    } 
} 

을 Model Entity 다이어그램에서 데이터베이스를 다시 만들었 으면 웹 사이트의 "/ Seed"URL로 이동하면 시드 데이터로 다시 채워집니다.

+0

Downvoters는 관심이 신경 쓰시겠습니까? – Caltor