同一主表的两个外键

时间:2013-07-31 15:47:51

标签: ef-code-first entity-framework-5

我有两个班级:客户和协会。

客户可以与许多客户建立联系。每个关联都是定义类型(家庭,朋友等),即客户A是客户B的朋友。客户A与客户C相关。关联类型由枚举AssociationType定义。

为了在EF中创建它,我定义了以下类

public class Customer
{
    public string FirstName {get; set;}
    public string LastName {get; set;}

    public virtual ICollection<Association> Associations { get; set; }
}

public class Association
{
    public int CustomerId { get; set; }
    public virtual Customer Customer { get; set; }

    public int AssociatedCustomerId { get; set; }
    public virtual Customer AssociatedCustomer { get; set; }   

    public AssociationType AssociationType { get; set; }
}

我删除了数据注释,因为我无法将其编译。我收到错误:

  

“无法检查模型兼容性,因为数据库没有   包含模型元数据“。

有没有人有任何想法?

2 个答案:

答案 0 :(得分:0)

有时在数据库创建期间发生错误时会发生这种情况。然后创建数据库模式 - 除了__MigrationHistory表。当您再次运行应用程序时,如果模式仍然与模型保持同步,则EF希望检查__MigrationHistory表,如果该表不存在,则会抛出您遇到的异常。

要解决此问题,请手动删除数据库或将初始化程序设置为DropCreateDatabaseAlways<MyContext>(使用Database.SetInitializer(new DropCreateDatabaseAlways<MyContext>()) - 仅一次。创建数据库后,将其设置回您的原始初始化程序。

BTW:对于您的模型,您必须明确指定Customer.AssociationsAssociation.Customer相关,或者使用数据注释...

[InverseProperty("Customer")]
public virtual ICollection<Association> Associations { get; set; }

...或使用Fluent API:

modelBuilder.Entity<Customer>()
    .HasMany(c => c.Associations)
    .WithRequired(a => a.Customer)
    .HasForeignKey(a => a.CustomerId);

答案 1 :(得分:0)

谢谢Slauma, 你的回答让我们朝着正确的方向前进。 我们将以下配置添加到关联配置:

HasRequired(x => x.AssociatedCustomer).WithMany().WillCascadeOnDelete(false);