EF6 с SQLite - не восстановление списков - PullRequest
0 голосов
/ 13 июня 2019

Я использую EF6 для чтения и записи правил для некоторой проверки в БД SQLite. Код Первый подход. Я успешно выписал правила в БД. Поскольку я пытался их прочитать сейчас, сложные правила, которые содержат дочерние правила, похоже, содержат пустые списки дочерних правил, несмотря на то, что база данных правильно отражает их. Что там не так?

Иерархия классов: abstract Rule - абстрактный класс с методом "Validate". abstract ComplexRule: Rule - правило, которое может иметь дочерние правила SuperRule, OrRule, AndRule: реализации ComplexRule BasicRule: Rule - прямая имплементация, которая выполняет некоторое сопоставление с образцом.

Таблица, записанная в БД, выглядит так:

 RuleId,Condition,Value,Mode,Discriminator,ComplexRule_RuleId
 1,,,,SuperRule,
 2,*USA*,*PATT1*,1,BasicRule,1
 3,*CHN*,*PATT2*,1,BasicRule,1

Чтение кода выглядит так:

 using (var db = new RuleModel())
 {
   var q = db.Rules.OfType<SuperRule>).FirstOrDefault();
 }

это приводит к SuperRule, дочерние элементы которого пусты. В db.Rules содержатся все 3 правила, но между BasicRule и SuperRule нет никакой связи.

RuleModel (DbContext) выглядит следующим образом:

public class RuleModel : DbContext
{

    public RuleModel() : base("name=RuleModel")
    {
    }

    public virtual DbSet<Rule> Rules { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<RuleModel>(modelBuilder);
        Database.SetInitializer(sqliteConnectionInitializer);
    }        
}

Правила выглядят так:

public abstract class Rule
{
    [Key]
    public int RuleId { get; set; }
    public abstract RuleResult Match(Mapping m);

} 

public abstract class ComplexRule: Rule
{
    public IList<Rule> ChildRules { set; get; }

    public ComplexRule()
    {
        ChildRules = new List<Rule>();
    }
}

public class OrRule : ComplexRule
{
    public override RuleResult Match(Mapping m)
    {
       // Some logics
    }

    public OrRule() : base() { }

}

public class SuperRule: OrRule
{
    public override RuleResult Match(Mapping m)
    {
        //some logics
    }

    public SuperRule() : base()
    {

    }
}

public class BasicRule : Rule
{
    public string Condition { set; get; }

    public string Value { set; get; }

    public RuleMode Mode { set; get; }

    public BasicRule(string condition, string value, RuleMode mode = RuleMode.MODE_ANYWHERE)
    {
        Condition = condition;
        Value = value;
        Mode = mode;
    }
    public BasicRule() { }

    public override RuleResult Match(Mapping m)
    {
        // logics
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...