实体框架重复列问题

时间:2015-01-20 14:48:26

标签: c# entity-framework

我有一个类似的基本模型:

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_IdAccountId

AccountId始终为空。我不知道为什么会有这种行为

使用Entity Framework实现此目的的正确方法是什么?我尝试添加[ForeignKey]属性,但它不会改变任何内容。

谢谢。

2 个答案:

答案 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);