2013-09-06 3 views
0
내가 또 다른 문제가, 내 응용 프로그램 내 SimpleMembership 단계를 완료 한 후

은 ...ASP.NET MVC는 일대일 관계

namespace Korbball.Models 
{ 
    public class GamesContext : DbContext 
    { 
     public GamesContext() 
      : base("KorbballDBContext") 
     { 
     } 

     public DbSet<Games> Games { get; set; } 
     public DbSet<Teams> Teams { get; set; } 
    } 
    public class Games 
    { 
     [Key] 
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
     public int GameId { get; set; } 
     public int TeamA { get; set; } 
     public int TeamB { get; set; } 
     public int ResultA { get; set; } 
     public int ResultB { get; set; } 
     public int League { get; set; } 
     public DateTime StartDate { get; set; } 
     public Boolean Finished { get; set; } 
    } 

    public class Teams 
    { 
     [Key] 
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
     public int TeamId { get; set; } 
     public string TeamName { get; set; } 
    } 
} 

내 목표는, 결과 등 을 가진 게임을 만들 수 있습니다 팀 A & 팀 B 열은 팀 테이블의 팀 ID입니다.

올바른 관계를 설정하려면 어떻게해야합니까?

추가 정보 :

게임 테이블 ->

GamesID = 1 
TeamA = 1 
TeamB = 2 
ResultA = 10 
ResultB = 8 

팀 표 - 뷰에>

TeamId = 1 
TeamName = "Manchester" 

TeamId = 2 
TeamName = "Zurich" 

->

Manchester 10 : 8 Zurich 

답변

-1

좋아, 나는이에 코드를 변경 :

내 컨트롤러는 다음과 같습니다
public class GamesContext : DbContext 
{ 
    public GamesContext() 
     : base("KorbballDBContext") 
    { 
    } 

    public DbSet<Games> Games { get; set; } 
    public DbSet<Teams> Teams { get; set; } 
} 
public class Games 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int GameId { get; set; } 
    public virtual Teams TeamA { get; set; } 
    public virtual Teams TeamB { get; set; } 
    public int ResultA { get; set; } 
    public int ResultB { get; set; } 
    public int League { get; set; } 
    public DateTime StartDate { get; set; } 
    public Boolean Finished { get; set; } 
} 

public class Teams 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int TeamId { get; set; } 
    public string TeamName { get; set; } 
} 

:

public class GamesController : Controller 
{ 
    GamesContext db = new GamesContext(); 

    // 
    // GET: /Games/ 

    public ActionResult Index() 
    { 
     var games = from game in db.Games 
        join teama in db.Teams on game.TeamA.TeamId equals teama.TeamId 
        join teamb in db.Teams on game.TeamB.TeamId equals teamb.TeamId 
        select game; 

     return View(games.ToList()); 
    } 
} 

@foreach (var item in Model) { 
<tr> 
    <td> 
     @Html.DisplayFor(modelItem => item.TeamA.TeamName) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.ResultA) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.ResultB) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.TeamB.TeamName) 
    </td> 
</tr> 

}

1

잘 모르겠어요 이것이 당신이하고 싶은 일이라면 하지만 이렇게 만들면 public virtual Team을 사용하면 엔티티 프레임 워크가 자동으로 매핑을 처리하고 일반 개체처럼 이러한 "탐색 속성"에 액세스 할 수 있습니다.

namespace Korbball.Models 
{ 
    public class GamesContext : DbContext 
    { 
     public GamesContext() 
      : base("KorbballDBContext") 
     { 
     } 

     public DbSet<Games> Games { get; set; } 
     public DbSet<Teams> Teams { get; set; } 
    } 
    public class Games 
    { 
     [Key] 
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
     public int GameId { get; set; } 
     public virtual Team TeamA { get; set; } 
     public virtual Team TeamB { get; set; } 
     public int ResultA { get; set; } 
     public int ResultB { get; set; } 
     public int League { get; set; } 
     public DateTime StartDate { get; set; } 
     public Boolean Finished { get; set; } 
    } 

    public class Teams 
    { 
     [Key] 
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
     public int TeamId { get; set; } 
     public string TeamName { get; set; } 
    } 
} 

편집는 :

좋아, 이것이 내가 일반적으로이 작업을 수행하는 방법입니다 : 내가 이미 지적했듯이 귀하의 경우에만 팀이 될 것이다, 모든 탐색 속성에 대한 가상 필드를 만들 아웃.

var teamM = new Team(){TeamName = "Manchester"}; 
var teamZ = new Team(){TeamName = "Zurich"}; 

// 'db' is your DbContext 

db.Teams.Add(teamM); 
db.Teams.Add(teamZ); 
// This could also happen through some user form or something. 

db.SaveChanges(); 
// this is important, because only after you've safed entities to you db, 
// the [DatabaseGenerated] key will be set. 

var game1 = new Game(); 
game1.ResultA = 10; 
game1.ResultB = 8; 

//etc. 

game1.TeamA = teamM; 
game1.TeamB = teamZ; 
// we still have those from up when we created an db.SaveChanges'd them 

// now save everything and the Entity Framework will take care of all the relationships 

db.SaveChanges(); 

이미 팀 저장 한 경우 그들은 당신이 데이터베이스에 존재 : 당신이 팀 (이 게임이 존재하기 전에 거기로) 만들 때 다음

, 당신은 그냥 좋아 추가 다음과 같이 할 수 있습니다.

var team1 = db.Teams.Find(0); // 0 beeing the [Key] => Manchester 
// or 
var team2 = db.Teams.Where(m => m.Name.Contains("Zu"); // => Zurich 

// Now do the same thing with game1: 

game1.TeamA = team1; 
game1.TeamB = team2; 

db.SaveChanges(); 

희망 사항을 알려주세요.

이것이 작동하지 않으면 엔티티 프레임 워크 코드에 대한 최신 튜토리얼을 먼저 번 살펴 봐야합니다. 모든 초기화/데이터베이스 생성에 많은 문제가 발생할 수 있습니다.

+0

내가이 가상 키에 약간의 변형을 시도했지만 한 그 작동하지 않거나 컨트롤러에서 모델로 데이터를 올바르게 제공하는 방법을 모르겠습니다. 그러나 당신의 대답에 대해 많은 감사드립니다! 나는 세부 사항을주기 위하여 질문에 무언가를 바꿨다 –

+0

나는 나의 편집에서 배치 한 것을 시도했다? 탐색 속성을 "가상"으로 선언하는 것은 매우 중요합니다. – moritzpflaum

+0

내 새로운 솔루션이 새로운 대답으로 게시됩니다. –