Unable to determine the principal end of the relationship - SQL Compact 4.0 ASP.NET MVC 5

0

Witam,

Dostaję błąd:Unable to determine the principal end of the 'Funeral_Home.Models.Kind_Category' relationship. Multiple added entities may have the same primary key.

Kierowałem się tym przestarzałym poradnikiem - http://www.asp.net/mvc/overview/older-versions/mvc-music-store/mvc-music-store-part-4

Niestety w tym kontrolerze przy linijce: var categories = storeDB.Categories.ToList(); wysypuje się błąd i nie wiem jak go naprawić.

namespace Funeral_Home.Controllers
{
    public class StoreController : Controller
    {

        FuneralHomeEntities storeDB = new FuneralHomeEntities();

        // GET: Store
        public ActionResult Index()
        {
            var categories = storeDB.Categories.ToList();
            return View(categories); 

Tutaj jest mój model bazodanowy:

  • Category.cs
 namespace Funeral_Home.Models
{
    public class Category
    {
        //[Key]
        public int CategoryId { get; set; }
        public string Name { get; set; }
        public int Description { get; set; }
        public List<Kind> Kinds { get; set; }
    }
}
  • FuneralHomeEntities.cs
 
namespace Funeral_Home.Models
{
    public class FuneralHomeEntities : DbContext
    {
        public DbSet<Kind> Kinds { get; set; }
        public DbSet<Category> Categories { get; set; }

    }
}
  • Kind.cs
 
namespace Funeral_Home.Models
{
    public class Kind
    {
       // [Key]
        public int KindId { get; set; }

       //[ForeignKey("CategoryId")]
        public int CategoryId { get; set; }

       // [ForeignKey("ProducerId")]
        public int ProducerId { get; set; }

        public string Title { get; set; }
        public decimal Price { get; set; }
        public string KindArtUrl { get; set; }
        public Category Category { get; set; }
        public Producer Producer { get; set; }
    }
}
  • Producer.cs

namespace Funeral_Home.Models
{
    public class Producer
    {
        //[Key]
        public int ProducerId { get; set; }

        public string Name { get; set; }
    }
}
 

No i metoda Seed:

 
namespace Funeral_Home.Models
{
    public class SampleData : CreateDatabaseIfNotExists<FuneralHomeEntities>
    {
        protected override void Seed(FuneralHomeEntities context)
        {
            var categories = new List<Category>
            {

                new Category {Name = "Trumny" },
                new Category {Name = "Znicze" },
                new Category {Name = "Wieńce"},
                new Category {Name = "Kwiaty doniczkowe" },
                new Category {Name = "Bukiety" },
                new Category {Name = "Akcesoria do sprzątania"},
                new Category {Name = "Ubrania/kosmetyki pogrzebowe" },
                new Category {Name = "Inne" }
            };

            var producers = new List<Producer>
            {
                new Producer { Name = "Zniczek z.o.o" },
                new Producer { Name = "Trumstol" },
                new Producer { Name = "Kamix" },
                new Producer { Name = "ERGON" }
            };

            new List<Kind>
            {
                new Kind { Title = "Dębowe", Category = categories.SingleOrDefault(g => g.Name == "Trumny"), Price = 2500M, Producer = producers.SingleOrDefault(a => a.Name == "Trumstol"), KindArtUrl = "/Content/Images/placeholder.gif" },
                new Kind { Title = "Lipowe", Category = categories.SingleOrDefault(g => g.Name == "Trumny"), Price = 1800M, Producer = producers.SingleOrDefault(a => a.Name == "Trumstol"), KindArtUrl = "/Content/Images/placeholder.gif" },
                new Kind { Title = "Swierkowe", Category = categories.SingleOrDefault(g => g.Name == "Trumny"), Price = 2000M, Producer = producers.SingleOrDefault(a => a.Name == "Trumstol"), KindArtUrl = "/Content/Images/placeholder.gif" },
                new Kind { Title = "Brzozowe", Category = categories.SingleOrDefault(g => g.Name == "Trumny"), Price = 2300M, Producer = producers.SingleOrDefault(a => a.Name == "Trumstol"), KindArtUrl = "/Content/Images/placeholder.gif" },
                new Kind { Title = "Male", Category = categories.SingleOrDefault(g => g.Name == "Znicze"), Price = 5M, Producer = producers.SingleOrDefault(a => a.Name == "Zniczek z.o.o"), KindArtUrl = "/Content/Images/placeholder.gif" },
                new Kind { Title = "Srednie", Category = categories.SingleOrDefault(g => g.Name == "Znicze"), Price = 10M, Producer = producers.SingleOrDefault(a => a.Name == "Zniczek z.o.o"), KindArtUrl = "/Content/Images/placeholder.gif" },
                new Kind { Title = "Duze", Category = categories.SingleOrDefault(g => g.Name == "Znicze"), Price = 15M, Producer = producers.SingleOrDefault(a => a.Name == "Zniczek z.o.o"), KindArtUrl = "/Content/Images/placeholder.gif" },
                new Kind { Title = "Proste", Category = categories.SingleOrDefault(g => g.Name == "Wieñce"), Price = 25M, Producer = producers.SingleOrDefault(a => a.Name == "Kamix"), KindArtUrl = "/Content/Images/placeholder.gif" },
                new Kind { Title = "Ozdobne", Category = categories.SingleOrDefault(g => g.Name == "Wieñce"), Price = 45M, Producer = producers.SingleOrDefault(a => a.Name == "Kamix"), KindArtUrl = "/Content/Images/placeholder.gif" },
                new Kind { Title = "Bratki", Category = categories.SingleOrDefault(g => g.Name == "Kwiaty doniczkowe"), Price = 17M, Producer = producers.SingleOrDefault(a => a.Name == "Kamix"), KindArtUrl = "/Content/Images/placeholder.gif" },
                new Kind { Title = "Róze", Category = categories.SingleOrDefault(g => g.Name == "Bukiety"), Price = 10M, Producer = producers.SingleOrDefault(a => a.Name == "Kamix"), KindArtUrl = "/Content/Images/placeholder.gif" },
                new Kind { Title = "Zmiotka i szufelka", Category = categories.SingleOrDefault(g => g.Name == "Akcesoria do sprzątania"), Price = 5M, Producer = producers.SingleOrDefault(a => a.Name == "ERGON"), KindArtUrl = "/Content/Images/placeholder.gif" },
                new Kind { Title = "Garnitur", Category = categories.SingleOrDefault(g => g.Name == "Ubrania/kosmetyki pogrzebowe"), Price = 45M, Producer = producers.SingleOrDefault(a => a.Name == "Trumstol"), KindArtUrl = "/Content/Images/placeholder.gif" },
                new Kind { Title = "Zapalki", Category = categories.SingleOrDefault(g => g.Name == "Inne"), Price = 2M, Producer = producers.SingleOrDefault(a => a.Name == "ERGON"), KindArtUrl = "/Content/Images/placeholder.gif" },

            }.ForEach(a => context.Kinds.Add(a));
        }
    }
}

Jak mam zmienić bazę żeby klucze obce,główne się nie kłóciły i żebym nie musiał zmieniać ich na interface'y Icolletion itd.? Powiem szczerze naczytałem się już tyle o tym błędzie że mam mętlik w głowie i nie wiem jak mam to naprawić.

DORZUCAM CAŁY PROJEKT BEZ FOLDERU PACKAGES - MOŻE TAK KOMUŚ BĘDZIE ŁATWIEJ MI POMÓC.

1

Błąd jest bardzo prosty. W metodzie Seed tworzysz kategorię:

new Category {Name = "Wieńce"} 

Po czym tworzysz dwie encje Kind z taką kategorią:

Category = categories.SingleOrDefault(g => g.Name == "Wieñce")

Widzisz już różnicę?:) Zamień "ñ" na "ń" i będzie działać.

0

Jezu, ratuj od bycia głupim i ślepym!

Dzięki Ci bardzo! Lepszej sobie zagwozdki nie mogłem sam zrobić :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1