Ok poprawiłem te klucze i w każdej tabeli ustawiłem sobie Primary Key jako Id.
Natomiast nie udało mi się nadal rozwiązać mojego problemu :(
Mam 7 modeli i zadeklarowanych 7 DbSetów bo chce robić w Code First.
Do tego dorobiłem sobie ShopInicjalizer.cs w którym na sztywno dodaje obiekty do tej bazy.
Chce się zalogować jako dodany użytkownik i wywala mi ten błąd z kluczami nawigacyjnymi:
The property 'UserId' cannot be configured as a navigation property. The property must be a valid entity type and the property should have a non-abstract getter and setter. For collection properties the type must implement ICollection<T> where T is a valid entity type.
Wiersz 102: using (var db = new ShopContext())
Wiersz 103: {
Wiersz 104: var user = db.Users.FirstOrDefault(u => u.Email == email);
Wiersz 105:
Wiersz 106: if (user != null)
Model dla Usera wygląda tak:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace SklepInternetowyMVC.Models
{
public enum ActivationStatus // czy konto aktywne
{
Yes, No
}
public enum UserRoles
{
Normal, Administrator, Disabled
}
public class User
{
[Key]
public int Id { get; set; }
public string Password { get; set; }
public string PasswordSalt { get; set; }
public string Email { get; set; }
public string UserAvatarUrl { get; set; } // avatar dla zarejestrowanego użytkownika
public string FirstName { get; set; }
public string LastName { get; set; }
public string Gender { get; set; }
public int Age { get; set; }
public string PhoneNumber { get; set; }
public DateTime RegistrationDate { get; set; }
public ActivationStatus IsActivated { get; set; } // czy konto zostało aktywowane ( 1 - tak, 0 - nie )
public int DiscountPoints { get; set; } // suma wszystkich punktów zniżki za zakupy
public UserRoles RoleOfUser { get; set; } // rola dla użytkownika
[ForeignKey("Address")]
public int AddressId { get; set; }
public virtual Address Address { get; set; }
}
}
Model dla Addresu wygląda tak:
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace SklepInternetowyMVC.Models
{
public class Address
{
[Key]
public int Id { get; set; }
public string City { get; set; }
public string PostalCode { get; set; }
public string StreetName { get; set; }
public string FlatNumber { get; set; }
[ForeignKey("User")]
public int UserId { get; set; }
public virtual User User { get; set; }
}
}
Tak wygląda tabela Orders:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace SklepInternetowyMVC.Models
{
public class Order
{
[Key]
public int Id { get; set; }
public uint ProductCount { get; set; } // ilosc zamówień
public DateTime OrderDate { get; set; } // data konkretnego zamówienia
public uint OrderDiscountPoints { get; set; } // punkty zniżki dla danego zamówienia
[ForeignKey("UserId")]
public int UserId { get; set; }
public List<Product> ProductList { get; set; }
}
}
Tak OrderDetails:
using System.ComponentModel.DataAnnotations;
namespace SklepInternetowyMVC.Models
{
public class OrderDetail
{
[Key]
public int Id { get; set; }
public Order Order { get; set; }
public Product Product { get; set; }
public int ProductCount { get; set; }
}
}
Product:
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace SklepInternetowyMVC.Models
{
public class Product
{
[Key]
public int Id { get; set; }
public string ProductName { get; set; } // nazwa produktu
public List<ProductCategory> ProductCategories { get; set; }
public decimal ProductPrice { get; set; } // cena produktu
public uint ProductCount { get; set; } // ilość produktu
public Suplier Suplier { get; set; }
public string ProductImageUrl { get; set; } // zdjecie dla produktu
public string ProductDescriptionText { get; set; } // opis produktu
public double ProductCalority { get; set; } // kalorycznosc
public double ProductCarbohydrates { get; set; } // zawartosc weglowodanów
public double ProductProteins { get; set; } // zawartość białka
public double ProductFat { get; set; } // zawartość tłuszczu
}
}
ProductCategory:
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace SklepInternetowyMVC.Models
{
public enum Category
{
Pieczywo, Zioła, Suplementy, Herbaty, Przetwory, Wędliny, Owoce, Warzywa, Soki, Nasiona, Nabiał, Pozostałe
}
public class ProductCategory
{
[Key]
public int Id { get; set; }
public string CategoryName { get; set; } // nazwa kategorii produktu
public string CategoryDescription { get; set; } // opis wybranej kategorii
public string CategoryImageUrl { get; set; } // obrazek dla daneh kategorii
}
}
I ostatnia Suplier:
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace SklepInternetowyMVC.Models
{
public class Suplier
{
[Key]
public int Id { get; set; }
public string CompanyName { get; set; }
public List<Address> CompanyAddresses { get; set; }
}
}
ShopContext wygląda tak:
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Diagnostics;
using SklepInternetowyMVC.Models;
namespace SklepInternetowyMVC.DAL
{
public class ShopContext : DbContext
{
public ShopContext()
: base(@"Data Source=nazwaserwera;Initial Catalog=SklepInternetowyMVC;Integrated Security=True")
{
}
public DbSet<User> Users { get; set; }
public DbSet<Address> Addresses { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }
public DbSet<Product> Products { get; set; }
public DbSet<ProductCategory> ProductCategories { get; set; }
public DbSet<Suplier> Supliers { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
}
A ShopInitializer.cs tak:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using SklepInternetowyMVC.Models;
namespace SklepInternetowyMVC.DAL
{
public class ShopInitializer : DropCreateDatabaseIfModelChanges<ShopContext>
{
protected override void Seed(ShopContext context)
{
var usr = new List<User>
{
new User
{
FirstName = "Józel", LastName = "Trombala", Age = 33,
Password = "admin123", PhoneNumber = "545656767",
DiscountPoints = 360, Email = "[email protected]", Gender = "Mężczyzna",
IsActivated = ActivationStatus.Yes, RegistrationDate = DateTime.Now,
RoleOfUser = UserRoles.Administrator, Address = new Address {City = "Poznań", PostalCode = "70-700", FlatNumber = "34", StreetName = "Polna"}
},
};
usr.ForEach(u => context.Users.Add(u));
context.SaveChanges();
var ord = new List<Order>
{
new Order
{
OrderDate = DateTime.Now, OrderDiscountPoints = 10, ProductCount = 4, ProductList = new List<Product>()
},
};
ord.ForEach(o => context.Orders.Add(o));
context.SaveChanges();
var ordDet = new List<OrderDetail>
{
new OrderDetail
{
Order = new Order(), Product = new Product(), ProductCount = 4
},
};
ordDet.ForEach(od => context.OrderDetails.Add(od));
context.SaveChanges();
var prod = new List<Product>
{
new Product
{
ProductCount = 234, ProductCategories = new List<ProductCategory>(),
ProductCalority = 345, ProductCarbohydrates = 34, ProductDescriptionText = "jakies przykładowe pieczywo",
ProductFat = 34, ProductImageUrl = "", ProductName = "Chleb wiejski", ProductPrice = 3.14m , ProductProteins = 234, Suplier = new Suplier()
},
};
prod.ForEach(p => context.Products.Add(p));
context.SaveChanges();
var prodcat = new List<ProductCategory>
{
new ProductCategory
{
CategoryDescription = "jaskakss", CategoryImageUrl = "", CategoryName = Category.Pieczywo.ToString(),
},
};
prodcat.ForEach(p => context.ProductCategories.Add(p));
context.SaveChanges();
var sup = new List<Suplier>
{
new Suplier
{
CompanyAddresses = new List<Address>(), CompanyName = "Remondis"
},
};
sup.ForEach(s => context.Supliers.Add(s));
context.SaveChanges();
}
}
}
Dałem sobie tam na razie DropCreateTablesIfModelsChanges.
Jak mam zadeklarować te klucze, żeby mi to wszystko działało? Bardzo proszę o pomoc :(
Inna sprawą jest jeszcze fakt, że nie wiem czy ta tabela mi się generuje.
Niby w Server Managerze jest ale nie ma w sobie tabel.