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]:用于乐观并发控制,标记属性在更新时用于检查数据的一致性。