阻碍EF迁移的重复属性名称

时间:2015-09-10 20:19:40

标签: entity-framework ef-code-first entity-framework-6 ef-migrations

我有一个TPH基类PayCaddyMessage,在我的代码优先模型中配置如下:

sealed class PayCaddyMessageConfig : PayCaddyEntityConfig<PayCaddyMessage>
{
    public PayCaddyMessageConfig()
    {
        Property(e => e.Subject)
            .IsRequired()
            .HasMaxLength(50);
        HasRequired(e => e.Sender);
        HasRequired(e => e.Receiver);
    }
}

我有一个派生自PayCaddyMessage的课程:

public class PayBetRequest: PayCaddyMessage
{
    public string SenderId { get; set; }
    public string ReceiverId { get; set; }
    public string Description { get; set; }
    public int Amount { get; set; }
    public bool PaymentAccepted { get; set; }
}

}

我删除了旧数据库,并尝试使用迁移启动新数据库。当我发出命令Add-Migration Create -Force时,我得到一个例外,其中包含以下信息:

System.Data.Entity.ModelConfiguration.ModelValidationException: One or more validation errors were detected during model generation:

ReceiverId: Name: Each property name in a type must be unique. Property name 'ReceiverId' is already defined.
SenderId: Name: Each property name in a type must be unique. Property name 'SenderId' is already defined.

我在代码中找不到重复的属性名称。 Duh,它不会编译,但我强烈怀疑EF将属性SenderIdReceiverId添加到PayBetRequest作为外键,而它们未在该类中显式声明,然后派生类PayBetRequest声明了这些属性。然后,在为迁移创建的类中,我最终得到了重复的属性名称。

如果我从派生类中省略这些属性,它们将无法在我的代码中使用,因为它们未在基类型上声明,并且我不知道如何将它们声明为基类型上的外键,所以我在那里省略了它们,HasRequired(e => e.Sender);在迁移中自动生成SenderId

1 个答案:

答案 0 :(得分:0)

SenderReceiver是基本类型的一部分,并且基本类型可以间接访问其外键。所以这些FK也可能是基类型的一部分:

public PayCaddyMessageConfig()
{
    Property(e => e.Subject)
        .IsRequired()
        .HasMaxLength(50);
    HasRequired(e => e.Sender).WithMany().HasForeignKey(p => p.SenderId);
    HasRequired(e => e.Receiver).WithMany().HasForeignKey(p => p.ReceiverId);
}

或者,正如您在评论中所说,您可以完全删除外键属性。如果您在派生类中需要Id,则可以通过以下方式访问它: Sender.Id

请记住,从模型中删除外键属性会​​将关联转换为independent associations in stead of foreign key associations