- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
由于 Entity Framework 使用 nvarchar(max)
作为字符串的默认值,我想将其他内容设置为默认值。
在 Entity Framework 6.1.3 中,我可以像这样修改 OnModelCreating(DbModelBuilder modelBuilder)
:
modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));
modelBuilder.Properties<DateTime>().Configure(c => c.HasPrecision(0));
modelBuilder.Properties<string>()
.Configure(s => s.HasMaxLength(256).HasColumnType("nvarchar"));
如果我随后修改了带有数据注释的属性,EF 将改为使用这些值,如下所示:
[MaxLength(128)]
public string Name { get; set; }
[Column(TypeName = "nvarchar(MAX)")]
[MaxLength]
public string Comment { get; set; }
但是使用 Microsoft.EntityFrameworkCore.SqlServer 2.1.0
我不能这样做,我也不能使用 Conventions
。
我可以像这样解决 datetime
但如果我尝试对字符串执行相同的操作,迁移会显示 type: "nvarchar(256)", maxLength: 128
如果我例如使用数据注释。我该如何解决这个问题?
foreach (var property in modelBuilder.Model.GetEntityTypes()
.SelectMany(t => t.GetProperties())
.Where(p => p.ClrType == typeof(DateTime)))
{
property.Relational().ColumnType = "datetime2(0)";
}
最佳答案
更新(EF Core 6.0+):
EF Core 6.0 终于通过所谓的 Pre-convention model configuration 添加了指定不同类型映射默认值的功能。 ,所以现在的代码应该是这样的:
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
base.ConfigureConventions(configurationBuilder);
configurationBuilder.Properties<string>()
//.AreUnicode(false)
//.AreFixedLength()
.HaveMaxLength(256);
}
文档链接中提供了更多示例。
重要说明:但是,正如@PeterB 在评论中提到并在 EF Core 问题跟踪器中验证的那样,出于某种原因,此配置具有更高的优先级(与模型构建器流畅的 API 相同),因此您赢了能够使用数据注释覆盖这些“默认值”(OnModelCreating
中的流畅配置仍然可以)。因此,如果您依赖数据注释来覆盖默认值,您可能需要使用下面的原始方法。
原文:
有几个属性会间接影响 string
属性的列类型 - MaxLength
(例如 varchar(256)
与 varchar (MAX)
、IsUnicode
(例如 nvarchar
与 varchar
)和 IsFixedLength
(例如 char
与 varchar
)。
当前模型 API 不一致。第一个可通过 GetMaxLength
访问和 SetMaxLength
, 第二个 - 通过 IsUnicode
和 IsUnicode
,第三个没有公共(public)模型 API(只有 Fluent API)。
因此,要设置 MaxLength
,您可以使用:
foreach (var property in modelBuilder.Model.GetEntityTypes()
.SelectMany(t => t.GetProperties())
.Where(p => p.ClrType == typeof(string)))
{
if (property.GetMaxLength() == null)
property.SetMaxLength(256);
}
这并不完全正确,因为在这种情况下 null
具有双重含义 - not specified 和 MAX
。
正确的方法需要使用 EF Core 内部 API,它提供了更多的配置方法,特别是允许您通过 ConfigurationSource
枚举值以及属性值。 ConfigurationSource
枚举值定义配置的优先级 - Convention
最低,然后是 DataAnnotation
,最后是 Explicit
最高的。整个想法是较低优先级的配置不会覆盖较高优先级已经设置的配置。所有公共(public)的 Fluent API 都使用 Explcit
,而在我们的例子中,Convention
非常适合(因为我们正在模拟传统的默认设置)。
因此,如果您接受警告“此 API 支持 Entity Framework Core 基础结构并且不打算直接在您的代码中使用。此 API 可能会在未来的版本中更改或删除。”,添加
using Microsoft.EntityFrameworkCore.Metadata.Internal;
和使用
foreach (var property in modelBuilder.Model.GetEntityTypes()
.SelectMany(t => t.GetProperties())
.Where(p => p.ClrType == typeof(string)))
{
((Property)property).Builder
.HasMaxLength(256, ConfigurationSource.Convention);
}
关于c# - EF Core 2.1.0 设置默认字符串长度和列类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50840730/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!