2013-09-06 4 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; } 
    } 
} 

Моя цель, чтобы создать игры с результатами и т.д. TeamA & Столбец TeamB shoukd будет TeamID из таблицы команд.

Какие шаги я должен сделать, чтобы установить правильные отношения.

Дополнительные информации:

Игры Таблица ->

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

EDIT:

Ok, это то, как я обычно делаю это: создать виртуальные поля для всех свойств навигации, которые в вашем случае будет только команды, как я уже указывал вне.

Затем, при создании команды (которые должны быть там до того, как игра может существовать), вы просто добавить их, как:

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

мое новое решение опубликовано в новом ответе. –

Смежные вопросы