EF Core - DB First 方法中不需要的属性
EF Core - not needed attributes in DB First approach
如果客户端使用 EFCore DB-first 方法连接到数据库,但永远不会进行任何迁移(仅进行简单的 CRUD 操作),TypeName
(在“列属性”中)参数是否必要?
如果未提供 TypeName
,则客户端应使用 class 中声明的类型,数据库应使用创建 table 时声明的类型。如果客户端永远不会执行任何迁移,忽略该属性并且根本不指定它是否正确?虽然 "Column" 属性是必须的,因为数据库中的列名并不总是与 C# 实体中的相同,但 Type 不是必需的。对吗?
我的第二个问题是,对于无需迁移即可连接到现有数据库的应用程序,是否有任何指南?在 db-first/no-migrations 方法的情况下根本不需要的属性列表?
编辑:
我不确定是否需要其他属性(在流利 API 中)是:
entity.HasIndex(e => e.Name);
entity.HasIndex(e => e.BankId).HasName("_dta_index_item_1_070970510");
entity.Property(e => e.Foo).IsUnicode(false);
entity.Property(e => e.Bar).HasDefaultValueSql("(getdate())");
我想从现有数据库生成我的模型和 DbContext,但没有必要的东西 仅 用于迁移。我只需要读取和写入数据库,所以我假设只有专有名称、类型和关系。我想,我不确定。
各种属性不仅用于迁移,还可以帮助 EF 确定在操作期间如何 compose/cast 值。一个例子是枚举。它们可以存储为整数或字符串。如果数据库已经设置为默认值,则不需要 HasDefaultValueSql("(getdate())");
之类的东西。 Db First 的列类型将根据它们的时间默认。如果您使用 Code-First,您会想要告诉 EF 字符串列应该有多大,以及它应该存储 Unicode 还是 ASCII,但对于 Db First,它只关心这两种数据类型是否兼容。 (C# 对象和数据库)
也就是说,实体上的大多数属性不需要任何属性。 EF 可以推断它们并确保它们兼容。我在实体中经常使用的唯一属性是 属性 名称,用于我希望在我的实体中使用更具描述性的名称的情况,以及 属性 类型,用于少数需要显式转换的情况。对于 PK,您需要将 DatabaseGeneratedOption 用于标识(或默认)列。我在我的表可能不遵循 EF 的默认命名约定期望的地方使用 [TableName]
。基本上,我默认根本不添加显式列配置(PK 和导航属性除外),然后仅添加需要的内容。我见过一些使用 Db First 的项目,其中每个实体中的每个 属性 都被映射出来。 IMO 它可能是彻底的,但有点过分。
属性或配置不会有什么坏处。关于确保 EF 不执行迁移或尝试初始化数据库的唯一需要担心的事情。对于 EF6,您必须通过 Database.SetInitializer<TDbContext>(null)
显式关闭此功能;至少对于 EF Core,您无需担心它,因为您必须显式调用它。
正如史蒂夫针对您的第一个困惑所做的解释
对于你的第二个问题
您可以使用 ef cores db 脚手架
Scaffold-DbContext "Your Connection String" Microsoft.EntityFrameworkCore.SqlServer -OutputDir YourModelFolder
如果客户端使用 EFCore DB-first 方法连接到数据库,但永远不会进行任何迁移(仅进行简单的 CRUD 操作),TypeName
(在“列属性”中)参数是否必要?
如果未提供 TypeName
,则客户端应使用 class 中声明的类型,数据库应使用创建 table 时声明的类型。如果客户端永远不会执行任何迁移,忽略该属性并且根本不指定它是否正确?虽然 "Column" 属性是必须的,因为数据库中的列名并不总是与 C# 实体中的相同,但 Type 不是必需的。对吗?
我的第二个问题是,对于无需迁移即可连接到现有数据库的应用程序,是否有任何指南?在 db-first/no-migrations 方法的情况下根本不需要的属性列表?
编辑:
我不确定是否需要其他属性(在流利 API 中)是:
entity.HasIndex(e => e.Name);
entity.HasIndex(e => e.BankId).HasName("_dta_index_item_1_070970510");
entity.Property(e => e.Foo).IsUnicode(false);
entity.Property(e => e.Bar).HasDefaultValueSql("(getdate())");
我想从现有数据库生成我的模型和 DbContext,但没有必要的东西 仅 用于迁移。我只需要读取和写入数据库,所以我假设只有专有名称、类型和关系。我想,我不确定。
各种属性不仅用于迁移,还可以帮助 EF 确定在操作期间如何 compose/cast 值。一个例子是枚举。它们可以存储为整数或字符串。如果数据库已经设置为默认值,则不需要 HasDefaultValueSql("(getdate())");
之类的东西。 Db First 的列类型将根据它们的时间默认。如果您使用 Code-First,您会想要告诉 EF 字符串列应该有多大,以及它应该存储 Unicode 还是 ASCII,但对于 Db First,它只关心这两种数据类型是否兼容。 (C# 对象和数据库)
也就是说,实体上的大多数属性不需要任何属性。 EF 可以推断它们并确保它们兼容。我在实体中经常使用的唯一属性是 属性 名称,用于我希望在我的实体中使用更具描述性的名称的情况,以及 属性 类型,用于少数需要显式转换的情况。对于 PK,您需要将 DatabaseGeneratedOption 用于标识(或默认)列。我在我的表可能不遵循 EF 的默认命名约定期望的地方使用 [TableName]
。基本上,我默认根本不添加显式列配置(PK 和导航属性除外),然后仅添加需要的内容。我见过一些使用 Db First 的项目,其中每个实体中的每个 属性 都被映射出来。 IMO 它可能是彻底的,但有点过分。
属性或配置不会有什么坏处。关于确保 EF 不执行迁移或尝试初始化数据库的唯一需要担心的事情。对于 EF6,您必须通过 Database.SetInitializer<TDbContext>(null)
显式关闭此功能;至少对于 EF Core,您无需担心它,因为您必须显式调用它。
正如史蒂夫针对您的第一个困惑所做的解释
对于你的第二个问题
您可以使用 ef cores db 脚手架
Scaffold-DbContext "Your Connection String" Microsoft.EntityFrameworkCore.SqlServer -OutputDir YourModelFolder