GVKun编程网logo

EF6 CodeFirst我的[Key] Id列不会自动增加,因为Identity列应该

21

如果您想了解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列应该

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 – 不会创建表

.net – Entity Framework 6 with SQLite 3 Code First – 不会创建表

使用NuGet的最新版本的EF6和sqlite。我终于得到了app.config文件工作后一些有用的帖子Stackoverflow。现在的问题是,虽然数据库是不创建表。

我的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吗?将欣赏帮助/指导,因为我现在完全卡住!

谢谢大家。

不幸的是,System.Data.sqlite.EF6中的EF6提供程序实现不支持创建表。我下载了sqlite源代码看看,但是找不到任何创建表和迁移的东西。 EF6提供程序基本上与它们的Linq实现相同,所以它的目的都是查询数据库而不是修改它。

我目前正在使用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 系列】

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_InsertStudent_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系列)

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系列)

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系列)的相关信息,请在本站查询。

本文标签: