C# 实体框架6.1.3层次结构id不工作
我正在尝试将SQL server HierarchyId数据类型与实体框架一起使用。由于entity framework不支持HierarchyId数据类型,因此我使用的entity framework fork具有HierarchyId支持: DB表如下:C# 实体框架6.1.3层次结构id不工作,c#,entity-framework-6,hierarchy,C#,Entity Framework 6,Hierarchy,我正在尝试将SQL server HierarchyId数据类型与实体框架一起使用。由于entity framework不支持HierarchyId数据类型,因此我使用的entity framework fork具有HierarchyId支持: DB表如下: CREATE TABLE OrgStructure( [Id] [hierarchyid] NOT NULL, [Level] AS ([Id].[GetLevel]()), [NodeId] [int] IDE
CREATE TABLE OrgStructure(
[Id] [hierarchyid] NOT NULL,
[Level] AS ([Id].[GetLevel]()),
[NodeId] [int] IDENTITY(1,1) NOT NULL,
[Title] [varchar](50) NULL)
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());
}
}
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();
}
}
使用HierarchyId数据类型的My实体定义如下:
public class OrgStructure
{
public HierarchyId Id { get; set; }
public Nullable<int> Level { get; set; }
public int NodeId { get; set; }
public string Title { get; set; }
}
我在上面显示的索引操作中遇到以下错误:
无法将“OrgStructure”上的“Id”属性设置为
“Microsoft.SqlServer.Types.SqlHierarchyId”值。你必须设置这个
属性设置为类型为的非空值
'System.Data.Entity.HierarchyId'
非常感谢为解决此错误提供的任何帮助 您是否尝试过使用
Computed
作为DatabaseGeneratedOption
而不是None
。实际上,错误消息有点误导。当我从实体定义和映射中删除“Level”属性时,它工作得很好。它被打破了,因为级别列被定义为计算列,它自动选择smallint作为数据类型,而在实体定义中,它的类型是int。您可以分享一个示例,说明如何将新行添加到OrgStructure
表中吗?@nocodename:我已经手动填充了表,只是尝试使用DbContext。我刚刚注意到的一点是,Id
属性是否应该设置为IsOptional()
?您是否已尝试使用Computed
DatabaseGeneratedOption按要求映射它?@nocodename:Sorry IsOptional()错误地出现了。我在尝试别的东西。更新的问题。你能提供你的代码来获取数据吗?尝试将其设置为“计算”,但没有帮助。
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<VisibilityHierarchyDBContext>((s) => new VisibilityHierarchyDBContext(Configuration.GetConnectionString("VisibilityDB")));
// Add framework services.
services.AddMvc();
}
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();
}
}