2017-02-14 6 views
1

У меня есть две таблицы, одна для клиентов и одна для кредитных карт, и между ними существует простая взаимно-однозначная связь (это не настоящие данные, это только для учебных целей).Простые отношения «один-к-одному» Entity Framework с кодовым кодом

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

Customer.cs (модель):

public class Customer 
{ 
    [Key] 
    public int Id { set; get; } 
    public string Username { set; get; } 
    public string Password { set; get; } 
    public string FirstName { set; get; } 
    public string Surname { set; get; } 
    public string Email { get; set; } 
    public CreditCard CreditCard { get; set; } 
} 

Customer стол:

Customer Table

CreditCard.cs (модель):

public class CreditCard 
{ 
    [Key, ForeignKey("Customer")] 
    public int Id { get; set; } 
    public string NameOnCard { get; set; } 
    public string CardNumber { get; set; } 
    public DateTime ExpiryDate { get; set; } 
    public string CCV { get; set; } 
    public Customer Customer { get; set; } 
} 

CreditCards стол:

Credit Card Table

Для отображения модели я просто передать клиенту из БД на мой взгляд:

Контроллер:

public class AuthenticationController : Controller 
{ 
    private SchemaDBContext db = new SchemaDBContext(); 
    public ActionResult Login() 
    { 
     User user = new User(); 
     return View(user); 
    } 

    [HttpPost] 
    public ActionResult Login(User user) 
    { 
     Customer customer = new Customer(); 
     if (ModelState.IsValid) 
     { 
      customer = db.Customers.FirstOrDefault(u => u.Username.Equals(user.Username) && u.Password.Equals(user.Password)); 
      if (customer!=null) 
      { 
       FormsAuthentication.SetAuthCookie(user.Username, false); 
       return View("test", customer); 
      } 
      else 
      { 
       ModelState.AddModelError("", "Login data is incorrect!"); 
      } 
     } 
     return View(customer); 
    } 
} 

Вид:

@using MVC_COMP1562.Models 
@model Customer 

@Html.DisplayFor(model => model.Username) 
@Html.DisplayFor(model => model.Password) 
@Html.DisplayFor(model => model.FirstName) 
@Html.DisplayFor(model => model.Surname) 
@Html.DisplayFor(model => model.Email) 
@Html.DisplayFor(model => model.CreditCard.NameOnCard) 
@Html.DisplayFor(model => model.CreditCard.CardNumber) 
@Html.DisplayFor(model => model.CreditCard.CCV) 

Seed, который инициализирует данные испытаний

public class SchemaDBInitializer : DropCreateDatabaseAlways<SchemaDBContext> 
    { 
     protected override void Seed(SchemaDBContext context) 
     { 
      var customers = new List<Customer> 
      { 
       new Customer 
       { 
        CreditCard = null, 
        Email = "[email protected]", 
        Id = 1, 
        Password = "carsonPass", 
        Username = "carsonUser", 
        FirstName = "Alexander", 
        Surname = "Carson" 
       }, 
       new Customer 
       { 
        CreditCard = null, 
        Email = "[email protected]", 
        Id = 2, 
        Password = "alonsoPass", 
        Username = "alonsoUser", 
        FirstName = "Meredith", 
        Surname = "Alonso" 
       } 
      }; 

      customers.ForEach(s => context.Customers.Add(s)); 
      context.SaveChanges(); 

      var creditcards = new List<CreditCard> 
      { 
       new CreditCard 
       { 
        CardNumber = "1234 3456 7890 1111", 
        CCV = "111", 
        Customer = customers[0], 
        ExpiryDate = new DateTime(2018, 04, 01), 
        Id = 1, 
        NameOnCard = "Alexander Carson" 
       }, 
       new CreditCard 
       { 
        CardNumber = "2222 0000 1234 6877", 
        CCV = "222", 
        Customer = customers[1], 
        ExpiryDate = new DateTime(2019, 05, 01), 
        Id = 2, 
        NameOnCard = "Meredith Alonso" 
       } 
      }; 

      creditcards.ForEach(s => context.CreditCards.Add(s)); 
      context.SaveChanges(); 

     } 
    } 
+1

Необходимо указать код своего контроллера. –

+0

@StephenMuecke Я отредактировал вопрос и добавил контроллер – Higeath

+1

Не уверен, что этот метод 'Login()' имел дело с созданием или редактированием 'User' или' CreditCard'. –

ответ

0

Если есть кто-то еще борется с той же проблемой, у меня было.

Благодаря Gert Arnold, я понял это, поскольку на самом деле я не назначаю никаких данных объектам объектов-потомков, которые, как я думал, в Entity Framework были автоматическими.

Ответ - ленивая загрузка.

например.

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

public class CreditCard 
{ 
    [Key, ForeignKey("Customer")] 
    public int Id { get; set; } 
    public string NameOnCard { get; set; } 
    public string CardNumber { get; set; } 
    public DateTime ExpiryDate { get; set; } 
    public string CCV { get; set; } 
    public virtual Customer Customer { get; set; } //<--- Here virtual 
} 
+0

Вы также можете использовать метод 'Include'. –

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