2016-11-28 96 views
1

我想測試一個複雜的linq2db映射的例子,其中包括繼承映射和嵌入對象。我按照來自測試項目的示例進行操作,但在插入操作時發生異常。在測試項目中,我沒有找到任何插入或更新操作的例子,所以我可能做錯了什麼。linq2db插入與繼承映射

[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")) 
     { 
     } 
    } 

在 「不要投的孩子在插入」 測試用例我得到

「System.Data.SqlClient.SqlException:無效的對象名稱Child1'。」

在 「插入中鑄子」:

「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 
{ 
    //... 
}