EntityFramework dwa DbContext The member with identity does not exist in the metadata collection

0

Witam serdecznie.
Uczę się trochę zabawy z ASP.NET MVC i mam pewien dosyć chyba specyficzny problem.
Rozbudowuję automatycznie generowany projekt (ten z gotową obsługą użytkowników). Dodałem sobie do niego nowy DbContext o wdzięcznej nazwie BlogContext. Jego zawartość to:

    public class BlogContext : DbContext
    {
        public BlogContext()
            : base("DefaultConnection")
        {
            
        }

        public DbSet<BlogEntry> BlogEntries { get; set; }
        public DbSet<Comment> Comments { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l=>l.UserId);
            modelBuilder.Entity<IdentityRole>().HasKey<string>(l => l.Id);
            modelBuilder.Entity<IdentityUserRole>().HasKey(r => new {r.RoleId, r.UserId});
            base.OnModelCreating(modelBuilder);
        }
    }

Mam też klasę odpowiedzialną za wpisy

    public class BlogEntry
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }

        [Required(ErrorMessage = "Pole jest wymagane.")]
        [StringLength(128,ErrorMessage = "Długość tytuły musi być między {2}-{0}",MinimumLength = 3)]
        public string Title { get; set; }

        [Required(ErrorMessage = "Wpis musi zawierać treść")]
        [StringLength(2048,ErrorMessage = "Długość wpisu musi być między {2}-{0}",MinimumLength = 3)]
        [AllowHtml]
        public string Content { get; set; }

        public virtual ApplicationUser Author { get; set; }

        public DateTime CreationDate { get; set; }

        public virtual ICollection<Comment> Comments { get; set; }
    }

Niestety przy próbie wywołania kodu

        public string AddEntry(string title, string content)
        {
            BlogEntry entry = new BlogEntry()
            {
                Author = UserManager.FindById(User.Identity.GetUserId()),
                Title = title,
                Content = content,
                CreationDate = DateTime.Now
            };

            using (var context = new BlogContext())
            {
                context.BlogEntries.Add(entry);
                context.SaveChanges();
            }
            return "Dodano wpis";
        }

Który to teoretycznie powinien ładnie dodać mi do bazy danych wpis przesłany w formularzu, otrzymuję komunikat taki jak na obrazku:
title

Wydaje mi się, że jest to właśnie wina tego, że posiadam dwa różne DbContext, ale nie wiem jak to naprawić. Jakieś pomysły?
Nie chcę wszystkich danych trzymać w samym ApplicationDbContext, bo to podobno nie jest dobra praktyka i dane użytkownika jako takiego powinno się odseparować jednak.

0

A masz dodane odpowiednie tabele w bazie? Jeśli dobrze pamiętam to ten context generowany dla użytkownika ma domyślnie włączone tworzenie brakujących tabel, ale w zwykłym contexcie chyba tego nie ma więc trzeba by włączyć migracje.
I skoro oba contexty korzystają z tej samej bazy to mimo wszystko chyba lepiej by było połączyć je w jeden. Ewentualnie zamiast dodawać pola w ApplicationDbContext możesz po nim dziedziczyć dzięki temu zawartość contextów w kodzie będzie oddzielona, ale korzystać będziesz tylko ze swojego.

0
purple napisał(a):

Witam serdecznie.

WUT?

Nie chcę wszystkich danych trzymać w samym ApplicationDbContext, bo to podobno nie jest dobra praktyka i dane użytkownika jako takiego powinno się odseparować jednak.

Odseparowanie polega na tym, że między kontekstami operujesz na ID, a nie na referencjach.

0

@somekind: Więc powinienem przerobić to tak, aby zamiast virtual ApplicationUser Author używać czegośw stylu string AuthorId?

0

Tak sądzę.

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