实体框架FK来自多个变量

时间:2016-08-03 12:58:12

标签: c# asp.net entity-framework

我正在努力实现的简短描述:

我的数据库中有几个表,我首先使用代码创建数据库(使用数据注释)。我正在尝试将多个字段标记为不同表格的FK。


Guid“AccountId”应该自己是账户表的FK。

Guid“AccountId”与Guid“CompanyId”一起构成FK到公司表。

“CompanyId”和“PersonId”应该是Person表的FK。

[Table("Timestamp")]
public class Timestamp : FullAuditedEntity<Guid>
{
    public const int MaxCardNrLength = 100;

    // The "AccountId" together with "PersonId" should be a FK to the Person table.
    // The "AccountId" together with "CompanyId" should be a FK to the Company table.
    // The "AccountId" standing alone should be a FK to the Account table
    [Required, ForeignKey("Account"), ForeignKey("Company"), ForeignKey("Person")]
    public virtual Guid AccountId { get; set; }

    [Required, ForeignKey("Worksite")]
    public virtual Guid WorksiteId { get; set; }

    [Required, MaxLength(MaxCardNrLength)]
    public virtual string CardNr { get; set; }

    [Required]
    public virtual DateTime StampedDate { get; set; }

    [Required]
    public virtual int StampedType { get; set; }

    [ForeignKey("Company"), Column(Order = 1)]
    public virtual Guid CompanyId { get; set; }

    [ForeignKey("Person"), Column(Order = 2)]
    public virtual Guid PersonId { get; set; }


    public virtual Person Person { get; set; }
    public virtual Account Account { get; set; }
    public virtual Worksite Worksite { get; set; }
    public virtual Company Company { get; set; }
}


所有这些混合形式作为一个整体形成了独特的FK,但我无法弄清楚如何使用Entity Framework执行此操作,因为它不是有效的语法:

[Required, ForeignKey("Account"), ForeignKey("Company")]

因为只能在单个变量上设置一个ForeingKey属性。

我有没有办法将两个变量标记为一个集体FK,或者以我现在的方式做任何方式?

感谢您的帮助。


修改 添加了我正在尝试完成和更新的数据库图表,以便包含所有字段的整个类都在此处。

What im trying to achieve

2 个答案:

答案 0 :(得分:0)

您可以使用流畅配置:doc

modelBuilder.Entity<Timestamp>().HasRequired(t => t.Company ).WithMany().HasForeignKey(t=>new{t.AccountId, t.CompanyId});

答案 1 :(得分:0)

如果要在许多外键中重用属性,则应按以下方式将ForeignKey属性添加到导航属性中:

[ForeignKey("AccountId, PersonId")]
public virtual Person Person { get; set; }
[ForeignKey("AccountId, CompanyId")]
public virtual Company Company { get; set; }