我想用實體框架使用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