2017-04-26 61 views
1

我想用實體框架使用SQL Server HierarchyId數據類型。由於實體框架沒有爲hierarchyid數據類型的支持我使用實體框架叉已HIERARCHYID支持: https://entityframework.codeplex.com/SourceControl/network/forks/zgabi/EfHierarchyId/latest實體框架6.1.3層次結構ID不起作用

數據庫表如下:

CREATE TABLE OrgStructure(
    [Id] [hierarchyid] NOT NULL, 
    [Level] AS ([Id].[GetLevel]()), 
    [NodeId] [int] IDENTITY(1,1) NOT NULL, 
    [Title] [varchar](50) NULL) 

我的實體,它使用hierarchyid數據類型定義如下:

public class OrgStructure 
{   
    public HierarchyId Id { get; set; } 
    public Nullable<int> Level { get; set; } 
    public int NodeId { get; set; } 
    public string Title { get; set; } 
} 

和的EntityFramework映射配置定義爲:

public class OrgStructureMapping: EntityTypeConfiguration<OrgStructure> 
{ 
    public OrgStructureMapping() 
    { 
     // Primary Key 
     this.HasKey(t => t.Id); 

     // Properties 
     this.Property(t => t.Id) 
      .HasColumnType("hierarchyId") 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 

     this.Property(t => t.NodeId) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

     this.Property(t => t.Title) 
      .HasMaxLength(50); 

     // Table & Column Mappings 
     this.ToTable("OrgStructure"); 
     this.Property(t => t.Id).HasColumnName("Id"); 
     this.Property(t => t.Level).HasColumnName("Level"); 
     this.Property(t => t.NodeId).HasColumnName("NodeId"); 
     this.Property(t => t.Title).HasColumnName("Title"); 
    } 
} 

的DbContext如下:

public partial class VisibilityHierarchyDBContext : DbContext 
{ 

    public virtual DbSet<OrgStructure> OrgStructure { get; set; } 

    public VisibilityHierarchyDBContext(string nameOrConnectionString) 
    : base(nameOrConnectionString) 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new OrgStructureMapping());    
    } 
} 

註冊的DbContext在startup.cs如下

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddScoped<VisibilityHierarchyDBContext>((s) => new VisibilityHierarchyDBContext(Configuration.GetConnectionString("VisibilityDB"))); 

     // Add framework services. 
     services.AddMvc(); 
    } 

使用的DbContext如下:

public class HomeController : Controller 
{ 
    VisibilityHierarchyDBContext context; 
    public HomeController(VisibilityHierarchyDBContext context) 
    { 
     this.context = context; 
    } 
    public IActionResult Index() 
    { 
     var o = context.OrgStructure.Take(5).ToList(); /* Exception is thrown here */ 

     return View(); 
    } 
} 

我得到的指數下面的錯誤上面顯示的操作:

'OrgStructure'上的'Id'屬性無法設置爲 'Microsoft.SqlServer.Types.SqlHierarchyId'值。您必須將此 屬性設置爲類型爲 'System.Data.Entity.Hierarchy.HierarchyId'的非空值。

任何幫助來解決這個錯誤是非常感謝。

+0

你能分享一下你如何在OrgStructure表中添加新行的例子嗎? – nocodename

+0

@nocodename:我手動填充表,只是試圖使用DbContext檢索現有數據。 –

+0

我剛剛注意到的東西 - 應該'Id'屬性設置爲'IsOptional()'?你有沒有嘗試用'Computed' DatabaseGeneratedOption按照需要映射它? – nocodename

回答

1

我想通了。其實錯誤信息有點誤導。當我從實體定義和映射中刪除「Level」屬性時,它的工作就像魅力一樣。因爲Level列被定義爲計算列,所以它自動選擇smallint作爲數據類型,而在實體定義中它的類型是int。

0

您是否嘗試過使用Computed作爲DatabaseGeneratedOption而不是None

+0

試圖將它設置爲計算,但沒有幫助。 –

相關問題