EF Core配置问题,在2个不同的类中使用了拥有类型

时间:2019-08-28 12:24:52

标签: c# mysql ef-core-2.2

我使用的是实体框架核心,我想在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方法能够正确运行,从而将联系人记录正确保存到数据库中?

1 个答案:

答案 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)");
        }
    }
}