EF таблица собственных ссылок в mysql - PullRequest
0 голосов
/ 15 мая 2018

Мне нужна одна таблица собственных ссылок, использующая EF (версия 6.0) в mysql (версия 5.7.20).

Таблица MySQL:

Create table Category
id int(11) Primary Key,
name varchar(50),
ParentId int(11) Default Null,
PRIMARY KEY (`id`),
KEY`Parent_Key` (`ParentId`),
CONSTRAINT`Parent_Key` FOREIGN KEY (`ParentId`) REFERENCES`Category` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;

КОД EF:

public class Category
{
    public int Id {get; set;}
    public string Description {get; set;}
    public int? ParentId {get; set;}

    public virtual Category Parent {get; set;}
    public virtual ICollection<Category> Children {get; set;}
};

EF ModelConfiguration

CategoryConfiguration() 
{
  this.HasKey(e => new {e.id})
  this.Property(e => e.id) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
  this.HasOptional(e => e.Parent) .WithMany(e => Children) .HasForeignKey(e => new {e.id, e.ParentId); }

Это код запуска скелета, который выполняется без ошибок.проблема в том, когда я получаю категорию по linq _db.Categories;свойство Parent и список Children всегда имеют значение null, даже если я добавлю предложение include.

PS: ParentId - это значение idCategory, если установить категорию в качестве родительской категории.

Кто-нибудь подскажет мнечто не так в моем коде и конфиге?Или это только можно получить в SQLServer не может получить работу в MySQL.

1 Ответ

0 голосов
/ 15 мая 2018

Я думаю, что вы скопировали / вставили и изменили код, так что это не ваше настоящее приложение.В вашей конфигурации есть что-то странное (2 ключа).
В любом случае, здесь есть рабочий пример с MySQL

Context

class Context : DbContext
{
    public Context(){}

    public Context(DbConnection connection) : base (connection, true){}

    public DbSet<Category> Categories { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Category>()
            .HasOptional(e => e.Parent).WithMany(e => e.Children).HasForeignKey(e => new {e.ParentId});
    }
}

Модель (такая же, как ваша, но ядобавлена ​​инициализация Детской коллекции

public class Category
{
    public Category()
    {
        Children = new List<Category>();
    }

    public int Id {get; set;}

    [MaxLength(50)]
    public string Description {get; set;}

    public int? ParentId {get; set;}

    public virtual Category Parent {get; set;}
    public virtual ICollection<Category> Children {get; set;}
}

Тестовое приложение (если вы запустите более 1 раза, вы получите исключение, потому что у вас будет 6 детей).

static void Main(string[] args)
{

    string connectionString = "Server=10.0.0.26;Database=EfTest;Uid=admin;Pwd=password";


    using (DbConnection connection = new MySqlConnection(connectionString))
    using (Context context = new Context(connection))
    {
        context.Categories.Add(new Category() { Description = "Root" });
        context.SaveChanges();

        Category rootCategory = context.Categories.First(_ => _.Description == "Root");
        rootCategory.Children.Add(new Category() { Description = "Child1" });
        rootCategory.Children.Add(new Category() { Description = "Child2" });
        rootCategory.Children.Add(new Category() { Description = "Child3" });
        context.SaveChanges();
    }

    using (DbConnection connection = new MySqlConnection(connectionString))
    using (Context context = new Context(connection))
    {
        Category rootCategory = context.Categories.First(_ => _.Description == "Root");
        Debug.Assert(rootCategory.Children.Count == 3);
    }


}
...