我有一个类似的基本模型:
public class Account
{
public int Id { get; set; }
public string Name { get; set; }
public List<Contact> Contacts { get; set; }
public Contact PrincipalContact { get; set; }
public int? PrincipalContactId { get; set; }
}
public class Contact
{
public int Id { get; set; }
public string Name { get; set; }
public Account Account { get; set; }
public int? AccountId { get; set; }
}
实体框架在表Contacts
上创建两列:Account_Id
和AccountId
。
列AccountId
始终为空。我不知道为什么会有这种行为
使用Entity Framework实现此目的的正确方法是什么?我尝试添加[ForeignKey]
属性,但它不会改变任何内容。
谢谢。
答案 0 :(得分:1)
在一对一关系的情况下,您需要提供一些额外的关系 信息,以便Code First知道哪个实体是主体,哪个是 依赖。
public class Account
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public List<Contact> Contacts { get; set; }
[ForeignKey("PrincipalContact")]
public int? PrincipalContactId { get; set; }
public virtual Contact PrincipalContact { get; set; }
}
public class Contact
{
[Key]
[ForeignKey("AccountOf")]
public int Id { get; set; }
public string Name { get; set; }
public virtual Account AccountOf { get; set; }
}
答案 1 :(得分:0)
Account_Id
列由EF基于一对多关系自动创建。如果您没有指定任何内容,按照惯例,EF将识别您的Navigation属性被称为Account
并且您的ForeignKey将被称为AccountId
这一事实,但由于您有一个具有相同名称的属性,EF将其更改为Account_Id
。
要创建您需要的两种关系,我建议您修改模型,如下所示:
public class Account
{
public int Id { get; set; }
public string Name { get; set; }
public List<Contact> Contacts { get; set; }
public Contact PrincipalContact { get; set; }
}
public class Contact
{
public int Id { get; set; }
public string Name { get; set; }
public Account Account { get; set; }
public int? AccountId { get; set; }
}
然后,在您的上下文中,您可以使用Fluent Api显式配置关系。
public class YourContext : DbContext
{
public IDbSet<Account> Accounts { get; set; }
public IDbSet<Contact> Contacts { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Contact>()
.HasOptional(c => c.Account)
.WithMany(e => e.Contacts)
.HasForeignKey(a => a.AccountId);
modelBuilder.Entity<Account>()
.HasOptional(c => c.PrincipalContact)
.WithMany()
.Map(c => c.MapKey("PrincipalContactId"));
}
}
如果要将PrincipalContactId
属性保留在Account
类上,则应以这种方式映射关系:
modelBuilder.Entity<Account>()
.HasOptional(c => c.PrincipalContact)
.WithMany().HasForeignKey(a => a.PrincipalContactId);