我想知道,如果有任何办法, 使用数据库优先方法与手动生成的类(模型)提前(就像代码优先方法), 但是没有使用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中找到了。
答案 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;