复制外键

时间:2016-03-04 23:02:23

标签: c# entity-framework

我有两个POCO实体,ApplicationUser和Account。

  • 一个帐户有很多ApplicationUsers。
  • 每个帐户只有一个ApplicationUser,即BillingContact

所以,我的实体是:

public class ApplicationUser
{
    public string Id { get; set; }

    public int AccountId { get; set; }
    public virtual Account Account { get; set; }
}

public class Account
{
    public int Id { get; set; }

    [ForeignKey("BillingContact")]
    public string BillingContactId { get; set; }
    public virtual ApplicationUser BillingContact { get; set; }

    public virtual ICollection<ApplicationUser> Users { get; set; }

我的问题是,当我创建迁移时,代码优先只部分了解BillingContact是外键。迁移代码使用BillingContactId外键创建Account表,但它还会创建一个额外的Account_Id外键字段。

我找到了一种解决方法,但它严重地没有通过“气味”测试。潜在的问题是我在这两个类之间有多个关系,这会混淆代码优先。特别是,ApplicationUser实体没有导航属性,它是BillingContact外键的“另一端”。

如果我向ApplicationUser添加一个导航属性,并使用InverseProperty属性标记它,那么代码优先似乎理解外键并且不会创建额外的字段:

public class ApplicationUser
{
    public string Id { get; set; }

    public int AccountId { get; set; }
    public virtual Account Account { get; set; }

    [InverseProperty("BillingContact")]
    public virtual ICollection<Account> MyBillingAccounts { get; set; }
}

此解决方法的问题在于MyBillingAccounts导航属性完全是假的。一个帐户有一个相关的ApplicationUser作为计费联系人,但反向关系(从ApplicationUser导航回BillingContactId外键)没有任何实际意义。

所以... 是否有更好(或正确)的方式来教授代码优先关于BillingContactId外键?

1 个答案:

答案 0 :(得分:3)

您只能使用流畅的映射执行此操作。例如,覆盖上下文的OnModelCreating

modelBuilder.Entity<Account>()
            .HasOptional(acc => acc.BillingContact)
            .WithMany()
            .HasForeignKey(acc => acc.BillingContactId);

WithMany()调用表示没有导航属性的关联的反向结束。