实体框架核心到同一张表的多个关系

时间:2018-08-18 05:35:03

标签: entity-framework .net-core

我对具有不同列的同一张表的两个引用有问题:

public class MainApplicationContext : DbContext
{
    public MainApplicationContext(MainSqlDbContext mainSqlDbContext)
    {
        MainSqlDbContext = mainSqlDbContext;
        this.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
    }

    public DbSet<Organisation> Organisations { get; set; }
    public DbSet<OrganisationContact> OrganisationContacts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
      modelBuilder.Entity<Organisation>()
          .HasKey(t => new { t.OrgId, t.OrgType, });
      modelBuilder.Entity<OrganisationContact>().Property(p => p.OcsId).HasValueGenerator<SequenceNumberValueGenerator>().ValueGeneratedOnAdd();

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(MainSqlDbContext.Database.GetDbConnection());
        base.OnConfiguring(optionsBuilder);
    }

    private MainSqlDbContext MainSqlDbContext;
}

[SequenceNameAttribute("ORGANISATIONCONTACTS", "web")]
[Table("ORGANISATIONCONTACTS", Schema = "dbo")]
[Serializable]
public partial class OrganisationContact
{
    [Column("OCS_ACTIVE")]
    [MaxLength(1)]
    public string OcsActive { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [Key]
    [Column("OCS_ID")]
    public int OcsId { get; set; }


    [Column("OCS_NAME")]
    [MaxLength(255)]
    public string OcsName { get; set; }


    [Column("OCS_ORGANISATION_KEY")]
    [RelationshipTableAttribue("ORGANISATIONS", "dbo")]
    //Relationships
    public int OcsOrganisationKey { get; set; }

    [ForeignKey("OcsOrganisationKey")]
    public Organisation Organisation { get; set; }


    [Column("OCS_TYPE")]
    [MaxLength(20)]
    [RelationshipTableAttribue("ORGANISATIONS", "dbo")]
    //  Relationships
    public string OcsType { get; set; }

    [ForeignKey("OCS_TYPE")]
    public Organisation Organisation1 { get; set; }
    public OrganisationContact()
    {
    }

}

[SequenceNameAttribute("ORGANISATIONS", "web")]
[Table("ORGANISATIONS", Schema = "dbo")]
[Serializable]
public partial class Organisation
{

    [Column("ORG_EMAIL")]
    [MaxLength(255)]
    public string OrgEmail { get; set; }

    [Range(0, int.MaxValue)]
    [Column("ORG_ID")]
    public int OrgId { get; set; }

    [Required]
    [Column("ORG_NAME")]
    [MaxLength(255)]
    public string OrgName { get; set; }

    [Required]
    [Column("ORG_TYPE")]
    [MaxLength(20)]
    public string OrgType { get; set; }

    [InverseProperty("Organisation")]
    public ICollection<OrganisationContact> OrganisationContacts { get; set; }

    [InverseProperty("Organisation1")]
    public ICollection<OrganisationContact> ORGANISATIONCONTACTS1 { get; set; }

    public Organisation()
    {
        this.OrganisationContacts = new HashSet<OrganisationContact>();

        this.ORGANISATIONCONTACTS1 = new HashSet<OrganisationContact>();

    }

}

我收到此错误:

  

System.InvalidOperationException:无法将属性'OCS_TYPE'添加到'OrganisationContact'类型,因为未指定属性类型且没有相应的CLR属性或字段。要添加阴影状态属性,必须指定属性类型。

1 个答案:

答案 0 :(得分:0)

这里的核心问题是您在表 Organisation 中定义了一个复合主键,但是您尝试将单个字段用作表 OrganisationContact 中的外键。

如果引用表的主键是复合键,则引用该表的外键也必须是复合键,并且必须由相同编号和类型的字段组成:

[Table("ORGANISATIONCONTACTS", Schema = "dbo")]
public partial class OrganisationContact
{
    // irrelevant declarations omitted for brevity...

    [Column("OCS_ORGANISATION_ORG_ID")]
    public int Organisation_OrgId { get; set; }

    [Column("OCS_ORGANISATION_ORG_TYPE")]
    public string Organisation_OrgType { get; set; }

    [ForeignKey(nameof(Organisation_OrgId) + "," + nameof(Organisation_OrgType))]
    public Organisation Organisation { get; set; }

    [Column("OCS_ORGANISATION1_ORG_ID")]
    public int Organisation1_OrgId { get; set; }

    [Column("OCS_ORGANISATION1_ORG_TYPE")]
    public string Organisation1_OrgType { get; set; }

    [ForeignKey(nameof(Organisation1_OrgId) + "," + nameof(Organisation1_OrgType))]
    public Organisation Organisation1 { get; set; }
}

[Table("ORGANISATIONS", Schema = "dbo")]
public partial class Organisation
{
    // irrelevant declarations omitted for brevity...

    [InverseProperty(nameof(OrganisationContact.Organisation))]
    public ICollection<OrganisationContact> OrganisationContacts { get; set; }

    [InverseProperty(nameof(OrganisationContact.Organisation1))]
    public ICollection<OrganisationContact> ORGANISATIONCONTACTS1 { get; set; }
}

一些建议:

  • 请发布MCV代码。有一些奇特的属性(例如 RelationshipTableAttribue )和未知类型引用( MainSqlDbContext )与该问题无关,但使得查看该问题更加麻烦。
  • 尽量避免使用硬编码的字符串。 nameof 运算符已经使用了很长一段时间(自C#6.0起)。
  • 配置数据库映射的首选方法是EF Core中的Fluent API。数据注释属性的功能非常有限。 (例如,您不能使用EF Core中的属性定义组合主键。)