EF框架中的非数据库字段用法介绍 (ef 非数据库字段)

Entity Framework(EF)是一个相当出色的ORM框架。它提供了一种轻松的方式来管理 .NET 应用程序中与数据库之间的交互。每个数据库带来的模式和模式限制,因此 EF 展现出了它所支持的功能的同时使其适应不同的数据库。然而,当有些值的表达方式不适合数据模型,这种情况可能会出现问题。

在 Entity Framework 中,非数据库字段可以非常有用。在本文中,我们将探讨在 EF 框架中使用非数据库字段的用法。我们将探讨如何创建和使用这些字段,如何应用在查询和数据模型上,以及 EF 中的限制。

什么是非数据库字段?

一个非数据库字段,是一个没有对应数据库列的属性。在 EF 中,它被称为计算字段(Computed Fields)或非映射字段(Unmapped Fields)。它们可能是由开发人员计算或指定,或者通过表达式或属性的组合生成。

这些字段有很多不同的用途。例如,开发人员可以使用非数据库字段添加类别属性,例如 Color 或 Level,那么数据表中就没有这样的列。

在EF中创建非数据库属性

想要在EF中创建非数据库属性,首先需要在数据Model实体类中定义一个属性。这个属性的唯一特征是它需要一个 [NotMapped] 标记。这个标记告诉 EF 此属性不需要映射到数据库中任何列。

“`csharp

public class OrderItem

{

public int Id { get; set; }

public string Name { get; set; }

public decimal Price { get; set; }

[NotMapped]

public bool IsFree { get; set; }

}

“`

在上面的代码段中,我们有一个 OrderItem 实体类,有 Name,Price 等等属性。IsFree 属性没有映射到数据库中的任何列,因为它有 [NotMapped] 属性。

在EF中查询非数据库属性

现在我们已经定义了一个非数据库属性,我们要如何查询 EF 中的计算属性?Option 1:在我们的数据模型定义中,通过使用 LINQ 的 Select 方法选择我们想要的属性。在我们的例子中,我们可以选择 OrderItem 实体类中的 Name、Price 和 IsFree。

“`csharp

var orderItems = context.OrderItems

.Select(x => new

{

x.Name,

x.Price,

IsFree = x.Price == 0

}).ToList();

“`

在代码中,我们选择 OrderItem 实体类的几个属性,包括 Name 和 Price。但是,我们还可以创建 IsFree 计算属性,它只是一个简单的布尔表达式,告诉我们当前 OrderItem 是否免费。EF 还可以为我们计算值。

Option 2:运用存储过程或 SQL 查询,在这方面我们可以为 Entity Framework 添加 Database SQL 查询非数据库字段。我们可以在我们的数据模型中使用 FromSqlRaw 方法或 FromSql Interpolated 方法并在方法中使用仅支持数据库提供者的 SQL 查询,如下所示:

“`csharp

var orderItems = context.OrderItems.FromSqlRaw(

@”SELECT Id, Name, Price,

CASE

WHEN Price = 0 THEN CAST(1 AS BIT)

ELSE CAST(0 AS BIT)

END AS IsFree

FROM OrderItems”)

.ToList();

“`

在上面的 SQL 查询中,我们为 OrderItem 的 Price 计算 IsFree 属性的值。这可以通过在 SQL 查询中使用 CASE 语句轻松实现。

一些注意点

现在我们已经知道如何在 EF 中使用非数据库字段了。尽管非数据库字段提供了很多好处,但也有一些限制和注意事项。

– 非数据库字段不保存在数据库中:因为我们使用 [NotMapped] 标记告诉 EF 我们不想映射到数据库中的列。这意味着非数据库字段不会保存到数据库中。当然,我们可以使用 LINQ 或 SQL 查询的方式获取这些值。

– 非数据库字段不支持修改等数据操作:我们不能对非数据库字段做出如 Add、Remove、Update 等增删改操作。我们需要修改相应的属性并进行更新。

– 非数据库字段可以通过 SQL 查询或存储过程添加:我们已经在代码中看到了如何使用 SQL 查询或存储过程向 EF 中添加非数据库字段。

– 不支持在 EF 中将实体对象编写为计算字段:虽然我们可以将实体属性标记为非映射属性,但是我们不能将整个实体对象标记为非映射字段。

结论

非数据库字段可以为我们的程序带来很多好处。这些字段可以让我们轻松地将其他属性和枚举添加到当前的实体类型中。例如,我们可能会发现某些实体在编写时需要一些临时属性。此时非数据库字段将是非常有用的。

在本文中,我们已经了解了 EF 框架中非数据库字段的使用方法。我们学习了如何创建和使用这些字段,例如如何在查询和数据模型上使用非数据库字段。我们还了解了一些 EF 中的限制。希望这篇文章是有用的,无论您是一名开发人员还是一名数据库管理员。

相关问题拓展阅读:

Ef DbMigration 非主键字段 怎么设置为自增

理论上来说

你的

和我的这个

this.Property(p => p.DishCode).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

意义是一样的

至于你说的 那种 我其实也试过 主键是肯定可以的 这个我也做过

ef code first 怎么生成数据库字段说明

就是为字段(model中的属性)设置默认值,如果不填时有默认值或者比如checkbox默认选中

ef core使用code first无法为mysql数据表设置字段默认值,该怎么办

这里我们选择 ASP.NET Core Web Application (.NET Core)

这里选择web 应用程序,然后更改身份验证 改为 不进行身份验证

然后再包管理控制台里执行下面两条命令

引用 EntityFrameworkCore

Install-Package Microsoft.EntityFrameworkCore

再引用 EntityFrameworkCore.SqlServer

Install-Package Microsoft.EntityFrameworkCore.SqlServer

创建实体

我们在项目添加一个 Models 文件夹。

新建一个User.cs

public class User

{

public int Id { get; set; }

public string UserName { get; set; }

public string Password { get; set; }

}

这里我为了方便,继续新建 DataContext.cs

public class DataContext : DbContext

{

public DataContext(DbContextOptions options)

: base(options)

{

}

public DbSet Users { get; set; }

}

创建数据库

打开 Startup.cs 在 ConfigureServices 下添加如下代码:

public void ConfigureServices(IServiceCollection services)

{

//这里就是填写数据库的链接字符串

var connection = “Data Source=.;Initial Catalog=EFCore;User ID=sa;Password=sa.123”;

services.AddDbContext(options => options.UseSqlite(connection));

// Add framework services.

services.AddMvc();

}

ef 非数据库字段的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于ef 非数据库字段,EF框架中的非数据库字段用法介绍,Ef DbMigration 非主键字段 怎么设置为自增,ef code first 怎么生成数据库字段说明,ef core使用code first无法为mysql数据表设置字段默认值,该怎么办的信息别忘了在本站进行查找喔。


数据运维技术 » EF框架中的非数据库字段用法介绍 (ef 非数据库字段)