2016-11-28 2 views
1

Я пытаюсь проверить сложный пример сопоставления linq2db, который включает в себя наследование и встроенный объект. Я следую примеру из проекта тестов, но получаю исключение в операции вставки. Я не нашел примеров операций вставки или обновления в тестовом проекте, поэтому, возможно, я что-то не так.Вставка linq2db с наложением map

[Table] 
    [Column("SomeString", "SomeModel.SomeString")] 
    [InheritanceMapping(Code = "code1", Type = typeof(Child1))] 
    [InheritanceMapping(Code = "code2", Type = typeof(Child2))] 
    public abstract class Parent 
    { 
     [PrimaryKey] 
     public int Id { get; } 

     public SomeModel SomeModel { get; private set; } 

     [Column(IsDiscriminator = true)] 
     public string DType { get; set; } 

     protected Parent(int id, SomeModel someModel) 
     { 
      Id = id; 
      SomeModel = someModel; 
     } 
    } 

    public class SomeModel 
    { 
     public SomeModel(string someString) 
     { 
      SomeString = someString; 
     } 

     [NotNull] 
     public string SomeString { get; } 

     internal SomeModel() 
     { 
     } 
    } 

    public class Child1 : Parent 
    { 
     public Child1(int id, SomeModel someModel, int threshold) : base(id, someModel) 
     { 
      Threshold = threshold; 
      DType = "child1"; 
     } 

     [Column] 
     public int Threshold { get; } 
    } 

    public class Child2 : Parent 
    { 
     public Child2(int id, SomeModel someModel, string code) : base(id, someModel) 
     { 
      Code = code; 
      DType = "child2"; 
     } 

     [Column] 
     public string Code { get; private set; } 
    } 

    [Test] 
    [TestCase("Dont cast child in insert")] 
    [TestCase("Cast child in insert")] 
    public void TestInheritanceMapping(string testMode) 
    { 
     var db = new DbNorthwind(); 
     db.Execute(@"IF OBJECT_ID('dbo.Parent', 'U') IS NOT NULL 
         drop table Parent"); 
     db.CreateTable<Parent>(); 
     Console.WriteLine(db.GetTable<Child1>().Select(c => c.Threshold).Any()); 
     switch (testMode) 
     { 
      case "Dont cast child in insert": 
       db.Insert(new Child1(1, new SomeModel("SomeString"), 1)); 
       db.Insert(new Child2(1, new SomeModel("SomeString"), "somecode!")); 
       break; 
      case "Cast child in insert": 
       db.Insert<Parent>(new Child1(1, new SomeModel("SomeString"), 1)); 
       db.Insert<Parent>(new Child2(1, new SomeModel("SomeString"), "somecode!")); 
       break; 
     } 
    } 

    public class DbNorthwind : DataConnection 
    { 
     public DbNorthwind() : base("SqlServer", From.ConnectionStrings.Get("storage.sqlserver")) 
     { 
     } 
    } 

На "Dont бросить ребенок в вкладыше" тест я получаю

"System.Data.SqlClient.SqlException: Недопустимое имя объекта 'Child1'."

На "Cast ребенка в вкладышем":

"System.ArgumentException: "Порог" не является членом типа"

Однако таблица "Родитель" создается правильно на "db.CreateTable();" шаг: enter image description here

Также выберите операцию, кажется, работает

Спасибо за помощь!

ответ

1

Извините за поздний отклик.

В этом случае следует указать имя таблицы для вашего типа родительского:

[Table("Parent")] // Here it is 
[Column("SomeString", "SomeModel.SomeString")] 
[InheritanceMapping(Code = "code1", Type = typeof(Child1))] 
[InheritanceMapping(Code = "code2", Type = typeof(Child2))] 
public abstract class Parent 
{ 
    //... 
}