EF6 relacja many to many

Odpowiedz Nowy wątek
2015-06-19 23:37
ar02
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");
                });

        }
    }

Pozostało 580 znaków

2015-06-20 00:35
0

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


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2015-06-20 10:27
ar02
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>();
        }

Pozostało 580 znaków

2015-06-20 13:47
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?


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2015-06-20 13:58
ar02
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; }
    }

Pozostało 580 znaków

2015-06-20 16:27
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.


Yubby dibby dibby dibby dibby dibby dibby dum..
Tja, też właśnie do tego doszedłem. No, ale jest weekend, wracam do prawdziwych ORMów. :P - somekind 2015-06-20 16:47

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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