Ошибка Entity Framework: одна или несколько ошибок проверки были обнаружены во время генерации модели с составным ключом - PullRequest
0 голосов
/ 08 ноября 2018

Я получаю ошибки проверки при использовании Entity Framework 6.2. Код был сгенерирован с использованием первого кода из существующей базы данных. Первичный ключ и внешний ключ являются составными и используют версию. Код был очищен, чтобы просто показать соответствующие части. Похоже, что он пытается поменять версию и значения идентификатора. Любые предложения будут с благодарностью.

public partial class MyParent
{
    public MyParent()
    {
        MyChild = new HashSet< MyChild >();
    }

    [Key]
    [Column(Order = 0)]
    [StringLength(50)]
    public string MyID { get; set; }

    [Key]
    [Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int MyVersion { get; set; }
}

public partial class MyChild
{
    [Key]
    [Column(Order = 0)]
    [StringLength(50)]
    public string ChildID { get; set; }

    [Required]
    [StringLength(50)]
    [ForeignKey("MyParent) Column(Order = 1)]
    public string MyID { get; set; }

    public string NextChild { get; set;}

    [Key]
    [Column(Order = 2)]
    [ForeignKey("MyParent")]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int MyVersion { get; set; }

    public virtual MyParent MyParent { get; set; }
    public virtual ICollection<MyChild> MyChilds1 { get; set; }

    public virtual MyChild MyChild1 { get; set; }
}

public partial class MyContext : DbContext
{
    public MyContext()
        : base("name= MyContext ")
    {
    }

    public MyContext (string connectionString) : base(connectionString)
    {
    }

    public virtual DbSet<MyParent> MyParent { get; set; }
    public virtual DbSet<MyChild> myChild { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MyParent>()
            .HasMany(e => e.MyChild)
            .WithRequired(e => e.MyParent)
            .HasForeignKey(e => new { e.MyID, e.MyVersion })
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<MyChild>()
            .HasMany(e => e.MyChilds1)
            .WithOptional(e => e.MyChild1)
            .HasForeignKey(e => new { e.ChildID, e.MyVersion });
    }
}

Error

"При генерации модели обнаружены одна или несколько ошибок проверки: MyParent_MyChild:: типы всех свойств в зависимой роли ссылочного ограничения должны совпадать с соответствующими типами свойств в главной роли. Тип свойства MyVersion для объекта «MyChild» не соответствует типу свойства «MyID» для объекта «MyParent» в ссылочном ограничении «MyParent_MyChild».

MyParent_MyChild: типы всех свойств в зависимой роли ссылочного ограничения должны совпадать с соответствующими типами свойств в главной роли. Тип свойства «ChildID» для объекта «MyChild» не соответствует типу свойства «MyVersion» для объекта «MyParent» в ссылочном ограничении «MyParent_MyChild».

Я добавил исправление для простого случая. Это было добавить теги ForeignKey и настроить последовательность столбцов. Это не работает на более сложных моделях, то есть на таблицах с самоссылкой (NextChild).

Новая ошибка:

$ exception {"Свойство навигации 'MyChild', объявленное для типа 'MyChild.MyChilds1, было настроено с конфликтующими внешними ключами."} System.InvalidOperationException

Код БД для внешних ключей:

    [PK_MyChild] PRIMARY KEY CLUSTERED ([ChildID] ASC, [MyVersion] ASC),
    [FK_MyChild_MyParent] FOREIGN KEY ([MyID], [MyVersion]) REFERENCES [dbo].[MyParent]([MyID], [MyVersion]),
    [FK_MyChild_MyChild] FOREIGN KEY ([NextChild], [MyVersion]) REFERENCES [dbo].[MyChild] ([ChildID], [MyVersion])
...