MVC5 Code First 一对一关系错误

MVC5 Code First One-To-One Relationship Error

我正在尝试为 MVC5 codefirst 建立一对一的关系。 I've looked this page 并做了完全相同的事情,但我遇到了错误。

这是我的 类 和上下文:

产品:

public class Product
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public string ProductDescription { get; set; }
    /// <summary>
    /// Display order
    /// </summary>
    public int Order { get; set; }
    public string TitleBackgroundColor { get; set; }
    public virtual TblClass TblClass { get; set; }
    public virtual ICollection<Order> Orders { get; set; }
    public virtual ICollection<Price> Prices { get; set; }
    public virtual ICollection<ProductFeature> ProductFeatures { get; set; }
}

TblClass:

 public class TblClass
{
    [Key, ForeignKey("Product")]
    public int ProductId { get; set; }
    public string ClassName { get; set; }
    public virtual ICollection<Permission> Permissions { get; set; }
    public virtual Product Product { get; set; }
    public int ClassOrder { get; set; }
}

数据库上下文:

   protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Role>()
            .HasMany<UserProfile>(r => r.UserProfiles)
            .WithMany(u => u.Roles)
            .Map(m =>
            {
                m.ToTable("webpages_UsersInRoles");
                m.MapLeftKey("RoleId");
                m.MapRightKey("UserId");
            });

        modelBuilder.Entity<TblClass>()
            .HasKey(c => c.ProductId);

        modelBuilder.Entity<Product>()
        .HasOptional(f => f.TblClass)
        .WithRequired(s => s.Product)
        .Map(t => t.MapKey("ProductId"));
    }

当我尝试 运行 'update-database -verbose' 我遇到了这个错误:

The navigation property 'Product' declared on type 'YazililarGaranti.Domain.Entities.TblClass' has been configured with conflicting foreign keys.

建立 1:1 关系时,您不必使用 .Map(t => t.MapKey("ProductId")。这应该有效:

public class Product
{
    public int ProductId { get; set; }
    //... other properties
    public virtual TblClass TblClass { get; set; }
    //... other properties
}

public class TblClass
{
    //[Key, ForeignKey("Product")] <-- remove these attributes
    public int ProductId { get; set; }
    public string ClassName { get; set; }
    //.. other properties
    public virtual Product Product { get; set; }
    public int ClassOrder { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    //other mappings

    modelBuilder.Entity<TblClass>()
        .HasKey(c => c.ProductId); 

    modelBuilder.Entity<Product>()
        .HasKey(c => c.ProductId); //consider to use database generated option

    //modelBuilder.Entity<Product>().Property(t => t.ProductId) 
        //.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

    modelBuilder.Entity<Product>()
        .HasOptional(f => f.TblClass)
        .WithRequired(s => s.Product);
}

希望对您有所帮助!