1

我需要帮助在实体框架中创建关系,因为我在尝试添加迁移时尝试的所有操作都会给我错误,或者如果我通过了,那么我会尝试更新数据库并收到关于同名索引的错误。

public class Profile
{
    public Profile()
    {
        Environments = new HashSet<Environment>();
    }

    [Key]
    public int Id { get; set; }

    public string VersionCreated { get; set; }

    public string DiskLocation { get; set; }

    public string Name { get; set; }

    public DateTime DateTime { get; set; }

    public virtual Product Product { get; set; }

    public virtual Instance OriginalInstance { get; set; }

    public virtual ICollection<Environment> Environments { get; set; } 
}


public class Instance
{
    public Instance()
    {
        TestResults = new HashSet<TestResult>();
        Environments = new HashSet<Environment>();
    }

    [Key]
    public int Id { get; set; }

    public string Name { get; set; }

    public string Version { get; set; }

    public string UserFriendlyName { get; set; }

    public virtual Product Product { get; set; }

    public virtual Profile LastKnownProfile { get; set; }

    public virtual Computer Computer { get; set; }

    public virtual ICollection<TestResult> TestResults { get; set; }

    public virtual ICollection<Environment> Environments { get; set; } 
}

上述类的问题在于 Profile 类中的 OrginalInstance 属性和 Instance 类中的 LastKnownProfile 应该只是这些特定表的外键,并且它们可能不会经常相同。它们也可能都为空。

我试过了:

modelBuilder.Entity<Instance>().HasRequired(i => i.LastKnownProfile);
modelBuilder.Entity<Profile>().HasRequired(p => p.OriginalInstance);

这给了我一个Unable to determine the principal end of an association between the types 'EcuWeb.Data.Entities.Instance' and 'EcuWeb.Data.Entities.Profile'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.错误。

与:

modelBuilder.Entity<Instance>().HasRequired(i => i.LastKnownProfile).WithOptional();
modelBuilder.Entity<Profile>().HasRequired(p => p.OriginalInstance).WithOptional();

数据库将外键引用添加回自身。

4

1 回答 1

1

... Profile 类中的 OrginalInstance 属性和 Instance 类中的 LastKnownProfile 应该只是这些特定表的外键,并且它们可能不会经常相同。它们也可能都为空。

在这种情况下,如果我没有误解您上面的报价,您实际上需要两个一对多的关系。这意味着许多 Profiles 可以具有相同的,并且许多 Instances 可以具有相同的. 正确的映射将如下所示:ProfileInstanceOriginalInstanceLastKnownProfile

modelBuilder.Entity<Profile>()
    .HasOptional(p => p.OriginalInstance)
    .WithMany()
    .Map(m => m.MapKey("OriginalInstanceId"));

modelBuilder.Entity<Instance>()
    .HasOptional(i => i.LastKnownProfile)
    .WithMany()
    .Map(m => m.MapKey("LastKnownProfileId"));

带有的行MapKey是可选的。没有它们,EF 将创建一个具有默认名称的外键。

另请注意,如果“两者都可能为空” ,则必须使用HasOptional(而不是)。HasRequired

于 2012-12-14T19:24:58.840 回答