实体框架中的数据库优先方法,没有自动生成的代码

时间:2014-09-03 19:17:37

标签: c# sql entity-framework

我想知道,如果有任何办法, 使用数据库优先方法与手动生成的类(模型)提前(就像代码优先方法), 但是没有使用Entity Framework使用数据库优先方法创建的自动生成的代码? 我有3个课程(前两个学生和课程有多对多关系),代表模型: 第一个是学生:

public class Student
{
    public int StudentID  { get; set;}

    public string Name  { get; set;}

    public DateTime BirthDate { get; set;}

    public ICollection<StudentToCourse> StudentToCourses { get; set; }

    public Student()
    {
        StudentToCourses = new List<StudentToCourse>();
    }
}

然后课程:

    public class Course
{
    public int CourseID { get; set; }

    public string CourseName { get; set; }

    public ICollection<StudentToCourse> StudentToCourses { get; set; }


    public Course()
    {
        StudentToCourses = new List<StudentToCourse>();
    }

}

带有附加属性的Relation / Intermediate Class StudentToCourse:

    public class StudentToCourse
{
    [Key, Column(Order = 0)]
    public int StudentID { get; set; }
    [Key, Column(Order = 1)]
    public int CourseID { get; set; }
    [Key, Column(Order = 2)]
    public DateTime Date { get; set; }

    public virtual Student Student { get; set; }

    public virtual Course Course { get; set; }

    //public ICollection<Student> Students { get; set; }

    //public ICollection<Course> Courses { get; set; }

    public int Grade { get; set; }

}

此外,我使用VS 2013中的LocalDb功能创建了数据库

我有3张桌子: 课程:

CREATE TABLE [dbo].[Courses]
(
[CourseID] INT NOT NULL PRIMARY KEY IDENTITY,
[CourseName] NVARCHAR(100) NOT NULL,
)

生:

CREATE TABLE [dbo].[Students]
(
[StudentID] INT NOT NULL PRIMARY KEY IDENTITY,
[Name] NVARCHAR(50) NOT NULL,
[BirthDate] DATETIME NOT NULL,
)

关系表StudentsToCourses:

CREATE TABLE [dbo].[StudentsToCourses]
(
[StudentID] INT REFERENCES Students(StudentID) NOT NULL,
[CourseID] INT REFERENCES Courses(CourseID) NOT NULL,
[Date] DATETIME NOT NULL,
[Grade] INT NOT NULL,
PRIMARY KEY (StudentID, CourseID, Date) 
)

不幸的是,我对这种方法没有运气,我确实得到了学生们的帮助。数据但我没有收到关系表中的数据,我无法收到每个学生的所有相关成绩。

我在google和stackoverflow中搜索了相关主题,但所有这些主题对我都没有帮助,尽管上面的例子我在topic中找到了。

2 个答案:

答案 0 :(得分:1)

是的,你可以。您只需要一个没有初始化策略的上下文(因此它不会尝试创建或迁移您现有的数据库):

public class ExistingDatabaseContext : DbContext
{
    public ExistingDatabaseContext()
        : base("ExistingDatabaseConnectionStringName")
    {
        Database.SetInitializer<ExistingDatabaseContext>(null);
    }

    // DbSets here for your "code-first" classes that represent existing database tables
}

请记住,此上下文无法进行迁移或任何其他形式的初始化,因此如果您还有实际的真正的代码优先表,那么您需要一个单独的上下文来管理那些。

答案 1 :(得分:1)

我怀疑,问题不在于您是否可以独立拥有数据库和类模型。当然可以!所有这些生成工具和迁移内容只能实现一个目标:让生活更轻松,帮助您保持两个模型同步。但你也可以自己做这项工作。最终结果始终是:两个模型 - 在运行时 - 不会相互交互。 (不要互动?不,不是这样。必须有一个中间人,一个ORM来连接这两个世界。)

您没有获取数据的原因是因为没有发生延迟加载。你的陈述是

var listOfGrades = _context.Students.Where(s => s.Name.StartsWith("J"))
                   .FirstOrDefault().StudentToCourses;

这需要延迟加载,因为FirstOrDefault()语句执行查询的第一部分。它呈现Student,随后访问StudentToCourses。但是这些不会加载,因为集合不是virtual。它应该是

public virtual ICollection<StudentToCourse> StudentToCourses { get; set; }

这使EF能够覆盖能够延迟加载的动态代理对象中的集合。

但当然更有效的是在一个陈述中获得集合,例如:

var listOfGrades = _context.Students.Include(s => s.StudentToCourses)
                   .Where(s => s.Name.StartsWith("J"))
                   .FirstOrDefault().StudentToCourses;