Я получаю ошибки проверки при использовании 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])