【问题标题】:Entity Framework: The 'ComplexType.Field' property does not exist or is not mapped to type 'Entity'实体框架:“ComplexType.Field”属性不存在或未映射到“实体”类型
【发布时间】:2017-02-15 19:15:30
【问题描述】:

我在将值对象/复杂类型的属性映射到实体时遇到问题。我有一个用户实体,它有一个名为 Credential 的复杂类型属性,它又具有属性:Email、UserName、Password 和 SecurityStamp。我正在尝试将属性从复杂类型映射到实体,源代码如下所示:

public class User
{
    public string Id { get; protected set; }
    public Credential Credential { get; protected set; }
    // unrelated properties and methods omitted for simplicity
}

public sealed class Credential: ValueObject<Credential>
{
    public string Email { get; private set; }
    public string UserName { get; private set; }
    public string Password { get; private set; }
    public string SecurityStamp { get; private set; }

    public Credential() { }

    public Credential(string email, string userName, string password, string securityStamp)
    {
        Email = email;
        UserName = userName;
        Password = password;
        SecurityStamp = securityStamp;
    } 

public class CoreContext: DbContext
{
    public IDbSet<User> Users { get; set; }

    public CoreContext(string connectionString) : base(connectionString) {}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<CoreContext>(null);

        modelBuilder.ComplexType<Credential>().Property(ucr => ucr.Email).HasColumnName("Email");
        modelBuilder.ComplexType<Credential>().Property(ucr => ucr.UserName).HasColumnName("UserName");
        modelBuilder.ComplexType<Credential>().Property(ucr => ucr.Password).HasColumnName("Password");
        modelBuilder.ComplexType<Credential>().Property(ucr => ucr.SecurityStamp).HasColumnName("SecurityStamp");

        modelBuilder.Entity<User>().Property(u => u.Credential.Email).HasColumnName("Email");
        modelBuilder.Entity<User>().Property(u => u.Credential.UserName).HasColumnName("UserName");
        modelBuilder.Entity<User>().Property(u => u.Credential.Password).HasColumnName("Password");
        modelBuilder.Entity<User>().Property(u => u.Credential.SecurityStamp).HasColumnName("SecurityStamp");
    }
}

如您所见,我试图将复杂类型属性映射到实体。我首先将 Credential 配置为复杂类型,然后在实体 User 上配置属性。但是,我收到以下错误:

The 'Credential.Email' property does not exist or is not mapped for the type 'User'.

我不明白为什么会这样。我已经尽我所能配置复杂类型映射,为什么它不起作用?有人对我可能做错了什么有想法吗?

【问题讨论】:

  • u.Credential 是一个导航属性,您已经在之前的行中映射了它。删除最后 4 行,因为这些不是 User 实体的属性。
  • @DevilSuichiro:照你说的做了,和以前一样的错误信息,它并没有解决问题。
  • @LordYggdrasill 你解决过这个问题吗?

标签: c# entity-framework orm entity complextype


【解决方案1】:

无法重现:

我在添加迁移后使用与您相同的设置得到了这个:

public override void Up()
{
    CreateTable(
            "dbo.Users",
            c => new
            {
                Id = c.String(nullable: false, maxLength: 128),
                Email = c.String(),
                UserName = c.String(),
                Password = c.String(),
                SecurityStamp = c.String()
            })
        .PrimaryKey(t => t.Id);
}

我唯一删除的是您在 Credential: ValueObject 上的基类,因为我没有它。一切看起来都不错,所以也许那个类有问题?

【讨论】:

  • 我认为 ValueObject 类没有任何问题,至少在映射方面没有。它只有几个方法,但没有属性/字段。
猜你喜欢
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
相关资源
最近更新 更多