2017-04-26 59 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

试图将它设置为计算,但没有帮助。 –

相关问题