外键属性是否可以作为复合主键的一部分?

时间:2015-09-09 13:11:54

标签: entity-framework entity-framework-6 code-first foreign-key-relationship composite-primary-key

遵循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))`

我不知道如何向E​​F解释外键属性EntityId是外键。

有人可以对此有所了解吗?

感谢。

0 个答案:

没有答案