如何正确使用实体框架代码与多个表

时间:2015-09-23 17:05:25

标签: c# asp.net-mvc database entity-framework code-first

我立即学习和工作。一个简单的教程教会我首先使用代码创建数据库。现在我想要几个表,但我最终得到了几个数据库。我很确定这是错的,对吧?

  

示例:我有一个名为" DefaultConnection"同   类似于" AspNetRoles"," AspNetUsers"等等。大。

     

但是......我有一个单独的博客数据库叫做#34; BlogDBContext"   用一张桌子。我有一个叫做课程的另一个数据库   " LessonDBContext"用一张桌子上课。我的朋友说   这是错的,我认为他是对的,但他一直在破坏事情   他试图解决它。

在不创建全新数据库的情况下,使用代码优先为不同模型设置表的正确方法是什么?

FWIW我认为这是关于我搞砸的地方:general secion of the tutorial I got it from

我为每个人做了类似的事情:

namespace ScatterSchool.Models
{
    public class Lesson
    {
        public int Id { get; set; }
        public string Subject { get; set; }
        public string Body { get; set; }
        public string Tags { get; set; }
        [Display(Name = "Lesson Date")]
        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateTime LessonDate { get; set; }

        //public virtual User User { get; set; }
    }

    public class LessonDBContext : DbContext
    {
        public DbSet<Lesson> Lessons { get; set; }
    }
}

我在Web.Config中设置了连接字符串......我得到了一个带有Lessons表的新数据库......

不确定他在做什么,但是他获得了一个包含课程,博客和用户表的数据库,而且所有内容都已破坏。他的代码看起来很相似,但是他隔离了所有的DbContexts:

namespace ScatterSchool.Models {
    public partial class Lesson {

        public int ID { get; set; }     
        public string Subject { get; set; }
        public string Body { get; set; }
        public string Tags { get; set; }
        public string DateCreated { get; set; }
        public int User_Id { get; set; }
        public virtual User User { get; set; }

    }
}

和上下文:

namespace ScatterSchool.Models {
    using System;
    using System.Data.Entity;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Linq;

    public partial class DatabaseContext : DbContext {
        public DatabaseContext() : base("name=Database") { }

        public virtual DbSet<Blog> Blogs { get; set; }
        public virtual DbSet<Lesson> Lessons { get; set; }
        public virtual DbSet<User> Users { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder) {
            modelBuilder.Entity<User>()
                .HasMany(e => e.Lessons)
                .WithRequired(e => e.User)
                .HasForeignKey(e => e.User_Id);
        }
    }
}

我制作的东西没有被破坏,但我认为我做错了。他做的东西坏了,但我认为他做得更好。

我只是想要一些关于正确设置每个模型的背景数据的一般指导或提示。

  

最后但重要的问题:我应该离开DefaultConnection吗?   数据库中包含所有重要的安全登录资源并创建一个新的   一个用于其他一切,或者只是将表添加到该数据库?一世   最终想为不同的用户展示不同的博客/课程。

1 个答案:

答案 0 :(得分:1)

你的朋友对他告诉你的事情是正确的。您的模型应该有一个DbContext。您在朋友所做的示例中提供的代码应该有效。

我唯一能看到的就是打破一切,你将不再拥有LessonDBContext或BlogDBContext。这些只需要更改为您的单个DatabaseContext,一切都应该按预期工作。

至于你的最后一个问题,我没有理由将登录系统从主数据库的其余部分中分离出来。除非您计划将AspNetUsers用于多个服务,否则最简单的方法就是拥有一个数据库。