我想用实体框架使用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'的非空值。
任何帮助来解决这个错误是非常感谢。
你能分享一下你如何在OrgStructure表中添加新行的例子吗? – nocodename
@nocodename:我手动填充表,只是试图使用DbContext检索现有数据。 –
我刚刚注意到的东西 - 应该'Id'属性设置为'IsOptional()'?你有没有尝试用'Computed' DatabaseGeneratedOption按照需要映射它? – nocodename