如果您想了解EF6CodeFirst我的[Key]Id列不会自动增加,因为Identity列应该的知识,那么本篇文章将是您的不二之选。同时我们将深入剖析.net–EntityFramework6wit
如果您想了解EF6 CodeFirst我的[Key] Id列不会自动增加,因为Identity列应该的知识,那么本篇文章将是您的不二之选。同时我们将深入剖析.net – Entity Framework 6 with SQLite 3 Code First – 不会创建表、16. 翻译系列:EF 6 Code -First 中使用存储过程【EF 6 Code-First 系列】、2.翻译系列:为EF Code-First设置开发环境(EF 6 Code-First系列)、3.翻译系列:EF Code-First 示例(EF 6 Code-First系列)的各个方面,并给出实际的案例分析,希望能帮助到您!
本文目录一览:- EF6 CodeFirst我的[Key] Id列不会自动增加,因为Identity列应该
- .net – Entity Framework 6 with SQLite 3 Code First – 不会创建表
- 16. 翻译系列:EF 6 Code -First 中使用存储过程【EF 6 Code-First 系列】
- 2.翻译系列:为EF Code-First设置开发环境(EF 6 Code-First系列)
- 3.翻译系列:EF Code-First 示例(EF 6 Code-First系列)
EF6 CodeFirst我的[Key] Id列不会自动增加,因为Identity列应该
我有几个类需要从包含Id的通用基类派生。暂时忽略其中之一,让我们说:
public class MyBase { [Key] public int Id { get; set; } }public class MyName : MyBase { public string Name { get; set; }}
我的上下文(DataContext)看起来像这样:
public DbSet<MyName>MyNames { get; set; }// to avoid having EF make a MyBases table and instead map // MyBase.Id into MyNames and my other derived classes I do this ...protected override void OnModelCreating((DbModelBuilder modelBuilder) { modelBuilder.Entity<MyBase>() .Property(c => c.Id) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); modelBuilder.Entity<MyName>() .Map(m => { m.MapInheritedProperties(); m.ToTable("MyNames"); });}
当我启用迁移,初始添加迁移和更新数据库时,生成的数据库是我没有得到名为MyBases的表,而是得到了MyNames中的Id列。
dbo.MyNames ----------- Id (PK, int, not null) Name (nvarchar(max), null)
到目前为止,所有这些都可以编译和构建,然后使用以下类似代码对其进行测试:
using ( DataContext dc = new DataContext()) { var jj = new MyName { Name = "Janice Joplin" }; dc.MyNames.Add(jj); dc.SaveChanges(); var jh = new MyName { Name = "Jimmy Hendrix" }; dc.MyNames.Add(jh); dc.SaveChanges(); }
第一次有效(Janice的Id = 0添加),但第二次 无效 。…Jimmy获得了DUPLICATE
KEY异常。注意(为全面披露),我实际上是在代码的另一部分中创建jj和jh对象,然后将它们作为MyBase对象传递到该方法中(上面),然后将它们强制转换回MyName对象。我希望这不是问题。
我想如果所有内容都在一个表中,则ID可以标记为Identity,而@@
IDENTITY可以用于分配对象ID值。也许我毕竟需要制作一个MyBases表,并首先创建该记录,然后将Id复制到事务中的派生表中。最好的方法是什么?
此EF6 CodeFirst新手的任何帮助将不胜感激。谢谢。
答案1
小编典典我记得当我以前做过EF时,我会用Identity创建一个表,并在该类中将id列赋给
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
所以我假设你的代码应该是
modelBuilder.Entity<MyBase>() .Property(c => c.Id) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
.net – Entity Framework 6 with SQLite 3 Code First – 不会创建表
我的app.config:
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!-- For more information on Entity Framework configuration,visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection,EntityFramework,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <entityFramework> <providers> <provider invariantName="System.Data.sqlite" type="System.Data.sqlite.EF6.sqliteProviderServices,System.Data.sqlite.EF6" /> </providers> </entityFramework> <system.data> <DbProviderFactories> <remove invariant="System.Data.sqlite" /> <add name="sqlite Data Provider" invariant="System.Data.sqlite" description=".Net Framework Data Provider for sqlite" type="System.Data.sqlite.sqliteFactory,System.Data.sqlite" /> <remove invariant="System.Data.sqlite.EF6" /> <add name="sqlite Data Provider (Entity Framework 6)" invariant="System.Data.sqlite.EF6" description=".Net Framework Data Provider for sqlite (Entity Framework 6)" type="System.Data.sqlite.EF6.sqliteProviderFactory,System.Data.sqlite.EF6" /> </DbProviderFactories> </system.data> <connectionStrings> <add name="MyDBContext" connectionString="Data Source=|DataDirectory|MyDB.sqlite" providerName="System.Data.sqlite" /> </connectionStrings> </configuration>
我的简单测试程序:
class Program { static void Main(string[] args) { using (var db = new MyDBContext()) { db.Notes.Add(new Note { Text = "Hello,world" }); db.Notes.Add(new Note { Text = "A second note" }); db.Notes.Add(new Note { Text = "F Sharp" }); db.SaveChanges(); } using (var db = new MyDBContext()) { foreach (var note in db.Notes) { Console.WriteLine("Note {0} = {1}",note.NoteId,note.Text); } } Console.Write("Press any key . . . "); Console.ReadKey(); } public class Note { public long NoteId { get; set; } public string Text { get; set; } } public class MyDBContext : DbContext { // default constructor should do this automatically but fails in this case public MyDBContext() : base("MyDBContext") { } public DbSet<Note> Notes { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } } }
如果我手动创建表的程序工作正常,表更新。如果我删除数据库,EF将创建它,但不创建表,并且程序尝试读回带有该表不存在的错误消息的数据时失败。
有人设法让Code First使用EF6吗?将欣赏帮助/指导,因为我现在完全卡住!
谢谢大家。
我目前正在使用sql Server的所有工作,并使用SQL Server Compact & SQLite Toolbox为sqlite生成sql脚本。然后可以使用sqliteCommand运行脚本来模拟迁移。
更新
在EF7年,对sql服务器压缩的支持被放弃,并且EF团队正在开发sqlite的新提供程序。提供程序将使用Microsoft的受管sqlite包装程序项目,Microsoft.Data.SQLite
而不是System.Data.sqlite项目。这也将允许在iOS,Android,Windows Phone / Mobile,Linux,Mac等上使用EF7,因为Microsoft的包装程序正在开发为便携式库。
它仍然处于测试阶段,但是如果你想看看,你可以从MyGet(dev,master,release)的ASP.Net开发源获取nuget包。查找EntityFramework.sqlite包。
16. 翻译系列:EF 6 Code -First 中使用存储过程【EF 6 Code-First 系列】
原文链接:https://www.entityframeworktutorial.net/entityframework6/code-first-insert-update-delete-stored-procedure-mapping.aspx
EF 6 Code-First 系列文章目录:
- 1 翻译系列:什么是 Code First (EF 6 Code First 系列)
- 2. 翻译系列:为 EF Code-First 设置开发环境 (EF 6 Code-First 系列)
- 3. 翻译系列:EF Code-First 示例 (EF 6 Code-First 系列)
- 4. 翻译系列:EF 6 Code-First 默认约定(EF 6 Code-First 系列)
- 5. 翻译系列:EF 6 中数据库的初始化(EF 6 Code-First 系列)
- 6. 翻译系列:EF 6 Code-First 中数据库初始化策略(EF 6 Code-First 系列
- 7. 翻译系列:EF 6 中的继承策略(EF 6 Code-First 系列)
- 8. 翻译系列: EF 6 中配置领域类(EF 6 Code-First 系列)
- 9. 翻译系列:EF 6 以及 EF Core 中的数据注解特性(EF 6 Code-First 系列)
- 9.1 翻译系列:数据注解特性之 ----Table【EF 6 Code-First 系列】
- 9.2 翻译系列:数据注解特性之 ---Column【EF 6 Code First 系列】
- 9.3 翻译系列:数据注解特性之 Key【EF 6 Code-First 系列】
- 9.4 翻译系列:EF 6 以及 EF Core 中的 NotMapped 特性(EF 6 Code-First 系列)
- 9.5 翻译系列:数据注解之 ForeignKey 特性【EF 6 Code-First 系列】
- 9.6 翻译系列:数据注解之 Index 特性【EF 6 Code-First 系列】
- 9.7 翻译系列:EF 数据注解特性之 --InverseProperty【EF 6 Code-First 系列】
- 9.8 翻译系列:数据注解特性之 --Required 【EF 6 Code-First 系列】
- 9.9 翻译系列:数据注解特性之 --MaxLength 【EF 6 Code-First 系列】
- 9.10 翻译系列:EF 数据注解特性之 StringLength【EF 6 Code-First 系列】
- 9.11 翻译系列:数据注解特性之 --Timestamp【EF 6 Code-First 系列】
- 9.12 翻译系列:数据注解特性之 ConcurrencyCheck【EF 6 Code-First 系列】
- 10. 翻译系列:EF 6 中的 Fluent API 配置【EF 6 Code-First 系列】
- 10.1. 翻译系列:EF 6 中的实体映射【EF 6 Code-First 系列】
- 10.2. 翻译系列:使用 Fluent API 进行属性映射【EF 6 Code-First】
- 11. 翻译系列:在 EF 6 中配置一对零或者一对一的关系【EF 6 Code-First 系列】
- 12. 翻译系列:EF 6 中配置一对多的关系【EF 6 Code-First 系列】
- 13. 翻译系列:Code-First 方式配置多对多关系【EF 6 Code-First 系列】
- 14. 翻译系列:从已经存在的数据库中生成上下文类和实体类【EF 6 Code-First 系列】
- 15. 翻译系列:EF 6 中的级联删除【EF 6 Code-First 系列】
- 16. 翻译系列:EF 6 Code -First 中使用存储过程【EF 6 Code-First 系列】
- 17. 翻译系列:将 Fluent API 的配置迁移到单独的类中【EF 6 Code-First 系列】
- 18. 翻译系列:EF 6 Code-First 中的 Seed Data(种子数据或原始测试数据)【EF 6 Code-First 系列】
- 19. 翻译系列:EF 6 中定义自定义的约定【EF 6 Code-First 约定】
- 20. 翻译系列:Code-First 中的数据库迁移技术【EF 6 Code-First 系列】
- 20.1 翻译系列:EF 6 中自动数据迁移技术【EF 6 Code-First 系列】
- 20.2. 翻译系列:EF 6 中基于代码的数据库迁移技术【EF 6 Code-First 系列】
- 21. 翻译系列:Entity Framework 6 Power Tools【EF 6 Code-First 系列】
当 SaveChanges 方法被调用的时候,EF 6 可以用来创建并使用增删改存储过程。
我们来为下面的 Student 实体,创建增删改存储过程。
class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; }
public DateTime DoB { get; set; }
}
使用 MapToStoredProcedures () 方法,为实体配置默认的存储过程。
public class SchoolContext: DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>()
.MapToStoredProcedures();
}
public DbSet<Student> Students { get; set; }
}
EF API 将会为 Student 实体创建 Student_Insert
, Student_Update
和 Student_Delete存储过程。
Student_Insert 和 Student_Update 存储过程包含 Student 实体的所有属性的参数,Student_Delete 存储过程仅仅包含 Student 的主键属性 StudentID 一个参数:
CREATE PROCEDURE [dbo].[Student_Insert]
@StudentName [nvarchar](max),
@DoB [datetime]
AS
BEGIN
INSERT [dbo].[Students]([StudentName], [DoB])
VALUES (@StudentName, @DoB)
DECLARE @StudentId int
SELECT @StudentId = [StudentId]
FROM [dbo].[Students]
WHERE @@ROWCOUNT > 0 AND [StudentId] = scope_identity()
SELECT t0.[StudentId]
FROM [dbo].[Students] AS t0
WHERE @@ROWCOUNT > 0 AND t0.[StudentId] = @StudentId
END
CREATE PROCEDURE [dbo].[Student_Update]
@StudentId [int],
@StudentName [nvarchar](max),
@DoB [datetime]
AS
BEGIN
UPDATE [dbo].[Students]
SET [StudentName] = @StudentName, [DoB] = @DoB
WHERE ([StudentId] = @StudentId)
END
CREATE PROCEDURE [dbo].[Student_Delete]
@StudentId [int]
AS
BEGIN
DELETE [dbo].[Students]
WHERE ([StudentId] = @StudentId)
END
为实体映射自定义的存储过程
EF6 允许你使用自己的存储过程,你可以像下面这样进行配置,下面的代码为 Student 实体,映射了一个自定义的存储过程。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>()
.MapToStoredProcedures(p => p.Insert(sp => sp.HasName("sp_InsertStudent").Parameter(pm => pm.StudentName, "name").Result(rs => rs.StudentId, "Id"))
.Update(sp => sp.HasName("sp_UpdateStudent").Parameter(pm => pm.StudentName, "name"))
.Delete(sp => sp.HasName("sp_DeleteStudent").Parameter(pm => pm.StudentId, "Id"))
);
}
在上面的例子中,Student 实体映射了三个存储过程,sp_InsertStudent、sp_UpdateStudent、以及 sp_DeleteStudent. 当然同样对存储过程的参数进行了配置。
为所有实体配置存储过程
你可以使用下面的代码,为所有实体配置存储过程。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Types().Configure(t => t.MapToStoredProcedures());
}
局限性
- 仅仅只有 Fluent API 才能被用来映射存储过程。EF 6 中的数据注解特性,是不能映射存储过程的。
- 如果你想使用 CUD 操作,你就必须为实体映射 Insert,Update 以及 Delete 存储过程。仅仅是映射其中一个,是不被允许的。
2.翻译系列:为EF Code-First设置开发环境(EF 6 Code-First系列)
原文链接:http://www.entityframeworktutorial.net/code-first/setup-entity-framework-code-first-environment.aspx
EF 6 Code-First系列文章目录:
- 1 翻译系列:什么是Code First(EF 6 Code First 系列)
- 2.翻译系列:为EF Code-First设置开发环境(EF 6 Code-First系列)
- 3.翻译系列:EF Code-First 示例(EF 6 Code-First系列)
- 4.翻译系列:EF 6 Code-First默认约定(EF 6 Code-First系列)
- 5.翻译系列:EF 6中数据库的初始化(EF 6 Code-First 系列)
- 6.翻译系列:EF 6 Code-First中数据库初始化策略(EF 6 Code-First系列
- 7.翻译系列:EF 6中的继承策略(EF 6 Code-First 系列)
- 8.翻译系列: EF 6中配置领域类(EF 6 Code-First 系列)
- 9.翻译系列:EF 6以及EF Core中的数据注解特性(EF 6 Code-First系列)
- 9.1 翻译系列:数据注解特性之----Table【EF 6 Code-First 系列】
- 9.2 翻译系列:数据注解特性之---Column【EF 6 Code First系列】
- 9.3 翻译系列:数据注解特性之Key【EF 6 Code-First 系列】
- 9.4 翻译系列:EF 6以及 EF Core中的NotMapped特性(EF 6 Code-First系列)
- 9.5 翻译系列:数据注解之ForeignKey特性【EF 6 Code-First系列】
- 9.6 翻译系列:数据注解之Index特性【EF 6 Code-First系列】
- 9.7 翻译系列:EF数据注解特性之--InverseProperty【EF 6 Code-First系列】
- 9.8 翻译系列:数据注解特性之--Required 【EF 6 Code-First系列】
- 9.9 翻译系列:数据注解特性之--MaxLength 【EF 6 Code-First系列】
- 9.10 翻译系列:EF数据注解特性之StringLength【EF 6 Code-First系列】
- 9.11 翻译系列:数据注解特性之--Timestamp【EF 6 Code-First系列】
- 9.12 翻译系列:数据注解特性之ConcurrencyCheck【EF 6 Code-First系列】
- 10.翻译系列:EF 6中的Fluent API配置【EF 6 Code-First系列】
- 10.1.翻译系列:EF 6中的实体映射【EF 6 Code-First系列】
- 10.2.翻译系列:使用Fluent API进行属性映射【EF 6 Code-First】
- 11.翻译系列:在EF 6中配置一对零或者一对一的关系【EF 6 Code-First系列】
- 12.翻译系列:EF 6 中配置一对多的关系【EF 6 Code-First系列】
- 13.翻译系列:Code-First方式配置多对多关系【EF 6 Code-First系列】
- 14.翻译系列:从已经存在的数据库中生成上下文类和实体类【EF 6 Code-First系列】
- 15.翻译系列:EF 6中的级联删除【EF 6 Code-First 系列】
- 16.翻译系列:EF 6 Code -First中使用存储过程【EF 6 Code-First系列】
- 17.翻译系列:将Fluent API的配置迁移到单独的类中【EF 6 Code-First系列】
- 18.翻译系列:EF 6 Code-First 中的Seed Data(种子数据或原始测试数据)【EF 6 Code-First系列】
- 19.翻译系列:EF 6中定义自定义的约定【EF 6 Code-First约定】
- 20.翻译系列:Code-First中的数据库迁移技术【EF 6 Code-First系列】
- 20.1翻译系列:EF 6中自动数据迁移技术【EF 6 Code-First系列】
- 20.2.翻译系列:EF 6中基于代码的数据库迁移技术【EF 6 Code-First系列】
- 21.翻译系列:Entity Framework 6 Power Tools【EF 6 Code-First系列】
使用Code-First开发模式,你需要在项目中,通过Visual Studio安装Entity Framework.dll(EF API)。
这里,我们在Visual Studio中通过Nuget来安装Entity Framework。我们创建一个控制台应用程序:
如上图所示:在解决方案下,鼠标右键选择项目名称,选择管理Nuget程序包
安装成功之后,项目中就多了EF的引用:
这样EF就安装好了。还可以通过Nuget程序包管理控制台来安装EF哦。我们来看看怎么通过Nuget程序控制台来安装EF吧,首先得卸载掉EF。
选中项目,还是右键选择管理NuGet程序包,找到已经安装的EF卸载就可以了。
卸载完之后,我们看看怎么通过Nuget控制台安装EF吧:
选择工具--->Nuget包管理器-->程序包管理器控制台
不知道安装哪个版本的EF的话,打开https://www.nuget.org网站就知道了:
输入:Install-Package EntityFramework -Version 6.2.0,按下回车键就安装好了。
好了,EF安装教程就OK了。有不明白的可以留言。
3.翻译系列:EF Code-First 示例(EF 6 Code-First系列)
原文链接:http://www.entityframeworktutorial.net/code-first/simple-code-first-example.aspx
在前面一节中,我们学会了怎么,在我们项目中安装Entity Framework。现在我们来创建一个简单的Code-First示例吧:
假定,我们想为XYZ学校创建一个简单的应用程序,使用这个程序来添加、更新学生信息,以及学生分数信息,班级信息还有老师信息。
不像之前传统做法那样,先创建数据库,这里我们为我们的学生创建学生领域类。首先创建Student,以及Grade实体,代码中一个学生实体和一个Grade实体相关联。这被称作为一对多的关系。后面的章节中,我们将会学到EF怎么管理实体之间的关系。
我们创建一个控制台应用程序,安装好EF。
然后创建Student 和Grade类
public class Student { /// <summary>
/// 学生ID /// </summary>
public int StudentID { get; set; } /// <summary>
/// 学生姓名 /// </summary>
public string StudentName { get; set; } /// <summary>
/// 出生日期 /// </summary>
public DateTime? DateOfBirth { get; set; } /// <summary>
/// 图片 /// </summary>
public byte[] Photo { get; set; } /// <summary>
/// 身高 /// </summary>
public decimal Height { get; set; } /// <summary>
/// 体重 /// </summary>
public float Weight { get; set; } /// <summary>
/// 导航属性--Grade--年级 /// </summary>
public Grade Grade { get; set; } }
public class Grade { public int GradeID { get; set; } public string GradeName { get; set; } public string Section { get; set; } public ICollection<Student> Students { get; set; } }
如上,我们创建好了程序的领域类。
Code-First方式,同样还需要一个上下文类,上下文类是继承自DbContext类的类。创建一个上下文类,如下,它继承自DbContext,暴露两个属性Students和Grades.
现在,我们已经创建好了Code-First方式需要的类,现在来测试一下:
运行项目:
表示一个学生信息已经成功添加到了数据库中。
但是,数据库在哪里呢?数据表呢?数据列呢?
这就是EF Code-First API 迷人之处。它基于你在上下文类的构造函数中传递的参数,创建数据库。因为这里,我们在上下文类的构造函数中没有传递任何参数,EF 就给我们在这里创建了数据库:
C:\Users\你的计算机名称
这个数据库不能附加,我们可以在配置文件,配置一下:
然后修改一下,上下文类的构造函数:
再运行项目看看:
说明成功创建了数据库,我们看下生成的数据库:
就像上面图形中所示,EF为我们创建了数据库,还创建了相应的数据表,数据列。这样我们就使用Code-First,创建了数据库.
请注意:如果你修改了实体,再运行项目的话,就会报错:例如,我在Student实体中加一个属性Email。
然后运行项目:
出现这个错误,是需要进行数据库迁移。你需要在上下文类中,定义数据库初始化策略,然后修改实体,最后运行项目。数据库迁移技术,我好多系列文章中都讲到了,当然 这个系列还是会告诉大家怎么配置,大家可以到时候好好跟着我巩固一下。
你现在肯定很好奇,EF API是怎么创建合适类型的数据列的,怎么创建主键,怎么创建外键的?答案就是使用Code-First默认的约定配置。下面一节中,我们将学习Code-First默认约定。
我们今天的关于EF6 CodeFirst我的[Key] Id列不会自动增加,因为Identity列应该的分享已经告一段落,感谢您的关注,如果您想了解更多关于.net – Entity Framework 6 with SQLite 3 Code First – 不会创建表、16. 翻译系列:EF 6 Code -First 中使用存储过程【EF 6 Code-First 系列】、2.翻译系列:为EF Code-First设置开发环境(EF 6 Code-First系列)、3.翻译系列:EF Code-First 示例(EF 6 Code-First系列)的相关信息,请在本站查询。
本文标签: