EF6 relacja many to many

0

Cześć,

Próbuje od kilku godzin rozgryźć w jaki sposób zrobić relacje many to many. Stworzyłem 2 proste klasy i próbuje przypisać produkt do klienta, ale niestety wyrzuca mi błąd. Czy mógłby mi ktoś wyjaśnić w jaki sposób stworzyć taką relację i przypisywać istniejące rekordy z jednej tabeli do drugiej ?


    class Program
    {
        static void Main(string[] args)
        {

            using (Context db = new Context())
            {
                Product p = db.Product.Where(item => item.ProductId == 1).SingleOrDefault();
                Customer c = db.Customer.Where(item => item.CustomerId == 1).SingleOrDefault();
                c.Products.Add(p);
                db.SaveChanges();
            }
        }
    }

    public class Customer
    {
        public int CustomerId { get; set; }
        public string FirstName { get; set; }

        public List<Product> Products { get; set; }
    }

    public class Product
    {
        public int ProductId { get; set; }
        public string ProductName { get; set; }

        public List<Customer> Customers { get; set; }
    }

    class Context : DbContext
    {
        public Context()
            : base("name=ctx")
        {
            this.Configuration.AutoDetectChangesEnabled = false;

        }

        public DbSet<Customer> Customer { get; set; }
        public DbSet<Product> Product { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Customer>()
                .HasMany(c => c.Products)
                .WithMany(p => p.Customers)
                .Map(m =>
                {
                    m.ToTable("Orders");
                    m.MapLeftKey("CustomerId");
                    m.MapRightKey("ProductId");
                });

        }
    }
0

Najpierw przeczytaj jaki błąd Ci wyrzuca. Podpowiem, że nie ma on związku z EF.

0

Cześć,

Zaktualizowałem oba modele o konstruktory, natomiast nadal mam problem z aktualizacją istniejących danych.
W sytuacji gdy tworze nowe rekordy wszystko działa jak należy. Problem pojawia się gdy próbuje przypisać istniejącego Klienta do istniejącego produktu tak jak poniżej:

                Product p1 = db.Product.SingleOrDefault(item => item.ProductId == 10);
                Customer c1 = db.Customer.SingleOrDefault(item => item.CustomerId == 6);
                c1.Products.Add(p1);
                db.SaveChanges();

Proszę o pomysły i sugestie jak rozwiązać mój problem. Dzięki!

Poniżej zaktualizowane konstruktory.


        public Customer()
        {
            Products = new List<Product>();
        }
        public Product()
        {
            Customers = new List<Customer>();
        }
0

A jak zmienisz: public List<Customer> Customers { get; set; } na public virtual ICollection<Customer> Customers { get; set; }, a w konstruktorze List na HashSet to też nie działa?

0

Niestety nadal jest tak samo. Nazwa produktu i Klienta uległa zmianie natomiast relacja nie została dodana do tabeli Orders

                Customer c1 = db.Customer.FirstOrDefault(item => item.CustomerId == 1);
                c1.FirstName = "1";
                Product p1 = db.Product.FirstOrDefault(item => item.ProductId == 1);
                p1.ProductName = "1";
                c1.Products.Add(p1);
                db.Entry(p1).State = System.Data.Entity.EntityState.Modified;
                db.Entry(c1).State = System.Data.Entity.EntityState.Modified;
                db.SaveChanges();

Modele po zmianie wyglądają tak:

    public class Customer
    {
        public int CustomerId { get; set; }
        public string FirstName { get; set; }

        public Customer()
        {
            Products = new HashSet<Product>();
        }

        public virtual ICollection<Product> Products { get; set; }
    }

    public class Product
    {
        public int ProductId { get; set; }
        public string ProductName { get; set; }

        public Product()
        {
            Customers = new HashSet<Customer>();
        }

        public virtual ICollection<Customer> Customers { get; set; }
    }
1

Przypuszczam że problemem jest this.Configuration.AutoDetectChangesEnabled = false; EF nie śledzi wtedy zależności i nie jest w stanie wpisać powiązania do tabeli Orders. Więc albo to włączysz tracąc wydajności ale zacznie działać(chyba) albo będziesz musiał samemu stworzyć tabelę Orders.

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