EFCore和EF6的使用和区别

1、Sqlserver是微软的亲儿子,很少会报错,EF报错问题最多出现在Mysql。以下使用mysql为例子

C#一般很形象,带Core的都是.Net Core平台的。
所以在.NetFramework平台我们使用EF6,也就是EntityFramework6
在.NetCore平台使用EFCore

2、直接上代码 (.Net6)

  internal class Program
  {
      static void Main(string[] args)
      {
          using (var context = new MyDbContext())
          {
              try
              {
                  // 查询第一条用户数据
                  var user = context.Users.FirstOrDefault();

                  if (user != null)
                  {
                      Console.WriteLine("用户ID: {0}", user.Id);
                      Console.WriteLine("用户名: {0}", user.Name);
                      Console.WriteLine("用户邮箱: {0}", user.Email);
                  }
                  else
                  {
                      Console.WriteLine("没有找到用户数据。");
                  }
              }
              catch (Exception ex)
              {
                  Console.WriteLine("发生错误: " + ex.Message);
              }
          }
          Console.ReadLine();
      }

  }

  [Table("userinfo")]
  public class User
  {
      public int Id { get; set; }
      public string Name { get; set; }
      public string Email { get; set; }
  }

  public class MyDbContext : DbContext
  {
     /* public MyDbContext(DbContextOptions<MyDbContext> option) : base(option)
      {

      }*/
      private  string GetConnectionString()
      {
          // 返回适用于MySQL的连接字符串
          return "server=localhost;database=mvvmlighteap;user=root;password=1314;";
      }

      protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
      {
          base.OnConfiguring(optionsBuilder);
          optionsBuilder.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString));
      }
      public string connectionString => GetConnectionString();
      public DbSet<User> Users { get; set; }

  }

.Net Core平台一般很少报错,直接Nuget安装两个类库就行

 Pomelo.EntityFrameworkCore.MySql
 Microsoft.EntityFrameworkCore

3、.NetFramework使用EF6

internal class Program
{
    static void Main(string[] args)
    {
        using (var context = new MyDbContext())
        {
            try
            {
                // 查询第一条用户数据
                var user = context.Users.FirstOrDefault();

                if (user != null)
                {
                    Console.WriteLine("用户ID: {0}", user.Id);
                    Console.WriteLine("用户名: {0}", user.Name);
                    Console.WriteLine("用户邮箱: {0}", user.Email);
                }
                else
                {
                    Console.WriteLine("没有找到用户数据。");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("发生错误: " + ex.Message);
            }
        }
        Console.ReadLine();
    }
}

[Table("userinfo")]
public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
}

public class MyDbContext : DbContext
{
    public MyDbContext() : base("MyDbContext")
    {
     
    } 
    public DbSet<User> Users { get; set; }
}

它是一定要配置web.config或者App.config的
需要注意的是,Mysql.Data.Entity已经弃用了,使用MySql.Data.EntityFramework
在以前需要注意MySql.Data和Mysql.Data.Entity的版本号一致,现在
MySql.Data和MySql.Data.EntityFramework的版本号一致
你要明白谁是微软的亲儿子,是sqlserver所以.config文件的默认值是

 <entityFramework>
   <providers>
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
   </providers>
 </entityFramework>

需要改成

 <entityFramework>
   <providers>    
     <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework, Version=8.4.0.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/>
</providers>
 </entityFramework>

注意你的版本号
当你安装MySql.Data.EntityFramework后默认配置文件会出现

<system.data>
	<DbProviderFactories>
		<remove invariant="MySql.Data.MySqlClient" />
		<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=8.4.0.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
	</DbProviderFactories>
</system.data>

如果没有需要加上

4、常用特性

[Table("tablename")]:指定模型类对应的数据库表名。如果类名和表名不同,或者需要为表指定一个别名,这个特性非常有用。

[Key]:标记模型类中的主键属性。

[Column("columnname")]:指定属性对应的列名,如果属性名和列名不同,或者需要为列指定一个别名。

[ForeignKey("ForeignKeyName")]:标记属性为外键,指定外键的名称。

[Required]:指示属性的值是必需的,不能为 null 或空字符串。

[MaxLength(length)]:指定字符串类型的属性的最大长度。

[StringLength(maximumLength)]:与 MaxLength 类似,但可以指定最大长度。

[DefaultValue(value)]:设置属性的默认值。

[Timestamp] / [RowVersion]:用于版本控制或乐观并发,标记属性为时间戳或行版本。

[ComplexType] / [Owned]:在 EF Core 中引入,但在 EF6 中没有直接对应的特性,用于定义复杂类型或拥有的类型。

[Index("indexname")] / [Index(IsUnique = true/false)]:为属性创建索引,并可以指定索引的名称和是否唯一。

[NotMapped]:指示 EF 忽略模型类中的某个属性或导航属性,不将其映射到数据库。

[ColumnOrder(order)]:指定列在数据库表中的显示顺序。

[DatabaseGenerated(DatabaseGeneratedOption)]:指示属性的值是由数据库生成的,例如自增主键。

[ConcurrencyCheck]:用于乐观并发控制,标记属性在更新时用于检查数据的一致性。
posted @ 2024-06-06 21:36  孤沉  阅读(38)  评论(0编辑  收藏  举报