我有两个POCO实体,ApplicationUser和Account。
所以,我的实体是:
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外键?
答案 0 :(得分:3)
您只能使用流畅的映射执行此操作。例如,覆盖上下文的OnModelCreating
:
modelBuilder.Entity<Account>()
.HasOptional(acc => acc.BillingContact)
.WithMany()
.HasForeignKey(acc => acc.BillingContactId);
空WithMany()
调用表示没有导航属性的关联的反向结束。