Ошибка приложения с SQL CE 4.0 и ASP.NET MVC 3 - PullRequest
0 голосов
/ 14 февраля 2012

У меня проблема с восстановлением БД после того, как Модель была изменена / обновлена.У меня есть три таблицы внутри одного файла БД "Сообщения", "Темы" и "Отношения".Если я запускаю приложение и выкладываю новую ветку, все выглядит нормально, я вижу ветку.Если я пытаюсь добавить сообщение в ветку, он выдает ошибку о том, что не может найти таблицу с именем «Тема».Если я проверю «Database Explorer» в Visual Web Developer, я вижу только таблицу «Posts», что неудобно.Теперь я где-то читал, что БД не создается до первого использования модели (сохранение?).

Мои настройки моделей:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.Data.Entity.Database;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity.ModelConfiguration;

namespace aspnet_forum.Models
{
    public class Threads
    {
        public int ID { get; set; }

        [Required]
        public string Name { get; set; }

        [Required]
        public string Author { get; set; }

        public DateTime Date { get; set; }
        public string Slug { get; set; }
    }

    public class ThreadsDBContext : DbContext
    {
        public DbSet<Threads> Threads { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            DbDatabase.SetInitializer(new MyThreadsDBContextInitializer());

            base.OnModelCreating(modelBuilder);
        }
    }

    public class MyThreadsDBContextInitializer : DropCreateDatabaseIfModelChanges<ThreadsDBContext>
    {
        protected override void Seed(ThreadsDBContext dbContext)
        {
            // seed data

            base.Seed(dbContext);
        }
    }
}

Я также использовал «DropCreateDatabaseAlways», что привело к той же ошибке.Модель сообщений аналогична теме с дополнительным полем «текст» и именем сообщения, где это уместно.

Модель отношений:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Data.Entity.Database;
using System.Data.Entity.ModelConfiguration;

namespace aspnet_forum.Models
{
    public class Relations
    {
        public int ID { get; set; }

        [ForeignKey("Threads")]
        public int ThreadID { get; set; }
        //public virtual Threads Thread { get; set; }

        [ForeignKey("Posts")]
        public int PostID { get; set; }
        //public virtual Posts Post { get; set; }
    }

    public class RelationsDBContext : DbContext
    {
        public DbSet<Relations> Relations { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            DbDatabase.SetInitializer(new MyRelationsDBContextInitializer());

            base.OnModelCreating(modelBuilder);
        }

    }

    public class MyRelationsDBContextInitializer : DropCreateDatabaseIfModelChanges<RelationsDBContext>
    {
        protected override void Seed(RelationsDBContext dbContext)
        {
            // seed data

            base.Seed(dbContext);
        }
    }
}

Мой Web.Config:

<connectionStrings>
    <add name="ThreadsDBContext"
         connectionString="Data Source=|DataDirectory|Forum.sdf"
         providerName="System.Data.SqlServerCe.4.0"/>
    <add name="PostsDBContext"
         connectionString="Data Source=|DataDirectory|Forum.sdf"
         providerName="System.Data.SqlServerCe.4.0"/>
    <add name="RelationsDBContext"
           connectionString="Data Source=|DataDirectory|Forum.sdf"
           providerName="System.Data.SqlServerCe.4.0"/>
  </connectionStrings>

Я попробовал и создал все таблицы и отношения вручную, и все это работает, как и ожидалось. Я просто не знаю, будут ли отношения работать так, как ожидалось.

Попытка установить отношение M2M между таблицами Threads, Posts и Relations.

PS: есть таблица "EdmMetadata".

1 Ответ

0 голосов
/ 14 февраля 2012

Вы должны добавить все три DbSets в один и тот же DbContext.Теперь, когда я снова прочитал ваш вопрос, я вижу, что Relations на самом деле является отношением многие-к-одному между Post и Thread.Этот класс можно пропустить.

Это может быть ваше новое решение:

namespace aspnet_forum.Models
{
    public class Thread
    {
        public int ID { get; set; }

        [Required]
        public string Name { get; set; }

        [Required]
        public string Author { get; set; }

        public DateTime Date { get; set; }
        public string Slug { get; set; }

        public virtual ICollection<Post> Posts { get; set; }
    }

    public class Post
    {
        public int ID { get; set; }

        [Required]
        public string Title { get; set; }

        [ForeignKey("Thread")]
        public int ThreadId { get; set; }
        public virtual Thread Thread { get; set; }
    }

    public class ForumContext : DbContext
    {
        public DbSet<Thread> Threads { get; set; }
        public DbSet<Thread> Posts { get; set; }
    }
}

Обратите внимание, что Thread имеет коллекцию Post с и как Post имеет Thread.Это заменит ваш Relationships класс.

Теперь вам также нужна только одна строка подключения:

<connectionStrings>
    <add name="ForumContext"
         connectionString="Data Source=|DataDirectory|Forum.sdf"
         providerName="System.Data.SqlServerCe.4.0" />
</connectionStrings>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...