遵循TPC模式。 我有一个名为Entity的抽象类,它由Person和LegalEntity继承。
public abstract class Entity
{
public int Id { get; set; }
}
public class LegalEntity : Entity
{
public string CorporateName { get; set;}
}
public class Person : Entity
{
public string Name { get; set; }
}
我还有一个名为Agent的人有很多孩子。为简化起见,我只会显示一个类订阅者。
public abstract class Agent
{
public int EntityId { get; set; }
public int RoleId { get; set; }
}
public class Subscriber : Agent
{
public string Number { get; set; }
public Entity Entity { get; set; } // No EntityId here because the foreign key correspond to the Id of Subscriber
}
在我的实体配置下面:
public AgentConfiguration()
{
HasKey(s => new { s.EntityId, s.RoleId });
...
}
public SubsbcriberConfiguration()
{
Map(m =>
{
m.MapInheritedProperties();
m.ToTable("T_ACTEUR_SOUSCRIPTEUR");
}
**.WithMany() //I don't want a property on the other side
.HasForeignKey(s => s.EntityId); // EF doesn't accept to put the property Id as a foreign key.**
}
public EntityConfiguration()
{
HasKey(e => e.Id);
Property(e => e.Id).HasColumnName("id_personne");
...
}
public PersonConfiguration()
{
Map(m =>
{
m.MapInheritedProperties();
m.ToTable("T_PERSONNE_PHYSIQUE");
});
}
我在抽象类Entity和具体类Subscriber之间有一对一的关系。 类Entity的主键同时是订阅服务器的复合主键的一部分和外键。
是否可以配置此方案?
当我将属性Id声明为外键时,EF会抛出如下异常:
外键组件'EntityId'不是'Subscriber'类型的声明属性。验证它是否未从模型中明确排除,并且它是有效的原始属性。
我尝试了很多场景,但我没有找到解决方案,因为我有一对一的关系,但表有不同的键,外键是复合主键的一部分。
如何首先在代码中将属性配置为外键以及复合主键的一部分?
我错过了什么?任何帮助将不胜感激!
我分解了类Agent和TPC的继承。现在,类订阅者没有父级。当我配置它如下:
public SubsbcriberConfiguration()
{
HasKey(s => new { s.EntityId, s.RoleId });
Property(s => s.EntityId).HasColumnName("id_personne")
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
Property(s => s.RoleId).HasColumnName("id_role")
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
...
ToTable("T_ACTEUR_SOUSCRIPTEUR");
HasRequired(s => s.Entity)
.WithMany()
.HasForeignKey(s => s.EntityId)
.WillCascadeOnDelete(false);
}
实体框架正在寻找另一个外键: 列Extent1.Entity_Id不存在
当我尝试加载订阅者时,EF生成的查询是:
`SELECT
"Extent1"."id_personne",
"Extent1"."id_role",
...
"Extent1"."Entity_Id"
FROM "T_ACTEUR_SOUSCRIPTEUR" AS "Extent1"
WHERE "Extent1"."id_personne" = ((73660)) AND
"Extent1"."id_role" = ((4))`
我不知道如何向EF解释外键属性EntityId是外键。
有人可以对此有所了解吗?
感谢。