我使用的是实体框架核心,我想在2个不同的类中使用相同的拥有类型。通常这很好,但是就我而言,我遇到了错误。
我正在使用MySql数据库,要求所有的布尔值都映射到列类型为tinyint(1)的数据库中的字段。为了在我的OnModelCreating方法中实现此目的,我遍历了所有属性,如果该属性为布尔值,则将其映射到tinyint(1)。但是,一旦我在2个不同的类中使用相同的拥有类型,就会收到错误消息。
下面,我写了一个演示程序来展示我的问题。您只需重新创建2个表,组织和联系即可。具有字段ID,街道和家庭。要使用MySQL,我已经安装了nuget包MySql.Data.EntityFrameworkCore(v8.0.17)。我已经在.net core 2.2控制台应用程序中运行了代码。
+
运行上面的代码后,显示的错误消息是System.InvalidOperationException:'实体类型'Address'无法添加到模型中,因为已经存在具有相同名称的弱实体类型'。代码中引发错误的部分是此位
String myString1 = "Hey Dude..." + "How are you?";
如何更改我的代码,以便OnModelCreating方法能够正确运行,从而将联系人记录正确保存到数据库中?
答案 0 :(得分:1)
问题是ClrType
不足以标识拥有的实体类型,因此modelBuilder.Entity(Type)
无法用于获取有效配置实体属性所需的EntityTypeBuilder
实例。 / p>
似乎在EF Core 2.x中没有很好的 public 方法,因此,我只能建议使用一些EF Core 内部(幸运地是在典型的内部使用警告下可以公开访问。)
您需要以下using
:
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
第一个用于EntityTypeBuilder
类,第二个用于AsEntityType()
扩展方法,该方法使您可以访问实现IEntityType
的内部类,尤其是Builder
属性。
修改后的代码如下:
var entityTypes = modelBuilder.Model.GetEntityTypes()
.ToList();
foreach (var entityType in entityTypes)
{
var properties = entityType
.GetProperties()
.ToList();
// (1)
var entityTypeBuilder = new EntityTypeBuilder(entityType.AsEntityType().Builder);
foreach (var property in properties)
{
if (property.PropertyInfo == null)
{
continue;
}
if (property.PropertyInfo.PropertyType.IsBoolean())
{
entityTypeBuilder // (2)
.Property(property.Name)
.HasConversion(new BoolToZeroOneConverter<short>())
.HasColumnType("tinyint(1)");
}
}
}