Ошибка внешнего ключа Entity Framework в двух классах подключения

Я использую Entity Framework 6.1 в ASP.NET MVC.

Моя модель:

public class Article
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public double Price { get; set; }

    [InverseProperty("Article")]
    public virtual ICollection<FormulaItem> FormulaItem { get; set; }
}

public class FormulaItem
{
    [Key]
    [Column(Order = 0)]
    public int Id { get; set; }

    [ForeignKey("IdMaster")]
    public virtual Formula Formula { get; set; }
    public int IdMaster { get; set; }

    [ForeignKey("IdArticle")]
    public virtual Article Article { get; set; }
    public int IdArticle { get; set; }

    public string Comment { get; set; }
    public int Count { get; set; }
}

public class Formula
{
    [Key]
    [Column(Order = 0)]

    public int Id { get; set; }
    public FormulaMode Mode { get; set; }

    // Wen add this line I get error  
    //[ForeignKey("IdArticle")]        
    //public virtual Article Article { get; set; }
    //public int? IdArticle { get; set; }               

    public string Comment { get; set; }
    public virtual IList<FormulaItem> Items { get; set; }

    public Formula()
    {
        Items = new List<FormulaItem>();
    }
}   

Этот образец работает нормально, но при добавлении нового poco:

    // When I add this line in class formula I get error  
    [ForeignKey("IdArticle")]        
    public virtual Article Article { get; set; }
    public int? IdArticle { get; set; } 

в класс Formula я получаю ошибку:

Formula_Items_Source_Formula_Items_Target:: количество свойств в зависимых и основных ролях в ограничении отношения должно быть одинаковым


person khoshghadam    schedule 14.07.2014    source источник


Ответы (2)


Рассмотрите возможность использования FluentAPI, поскольку он более удобен для пользователя:

    modelBuilder.Entity<FormulaItem>()
        .HasOptional(b => b.Article )
        .WithMany(a => a.FormulaItem);

И в вашем случае вам, должно быть, не хватает другого атрибута InverseProperty:

[InverseProperty("FormulaItem")]
public virtual Article Article { get; set; }
person Alexander Smirnov    schedule 14.07.2014
comment
привет, спасибо за ответ, я добавляю ваш код, но не работаю наверху, вы можете увидеть ошибку - person khoshghadam; 14.07.2014

Я добавить:

modelBuilder.Configurations.Add(new FormulaConfig());
public class FormulaConfig : EntityTypeConfiguration<Formula>
{
    public FormulaConfig()
    {               // one-to-many
        this.HasRequired(x => x.Article)
            .WithOptional(x=>x.Formula)         
            .WillCascadeOnDelete();

    }
}

но получаю ошибку:

Article_Formula_Target:: Кратность недопустима в роли "Article_Formula_Target" в отношении "Article_Formula". Поскольку свойства зависимой роли не являются ключевыми, верхняя граница кратности зависимой роли должна быть «*».

person khoshghadam    schedule 14.07.2014
comment
Что ж, это немного сбивает с толку ... Решите, чем вы хотите связать. Как я вижу, одна статья может быть FK для многих FormulaItems, а одна Formula может быть FK для многих FormulaItems. Тогда вам нужна статья в Формуле? Он у вас уже есть в FormulaItem. И вы строите FK для формулы ... - person Alexander Smirnov; 15.07.2014