我有一个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将属性SenderId
和ReceiverId
添加到PayBetRequest
作为外键,而它们未在该类中显式声明,然后派生类PayBetRequest
声明了这些属性。然后,在为迁移创建的类中,我最终得到了重复的属性名称。
如果我从派生类中省略这些属性,它们将无法在我的代码中使用,因为它们未在基类型上声明,并且我不知道如何将它们声明为基类型上的外键,所以我在那里省略了它们,HasRequired(e => e.Sender);
在迁移中自动生成SenderId
。
答案 0 :(得分:0)
Sender
和Receiver
是基本类型的一部分,并且基本类型可以间接访问其外键。所以这些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。