Ich versuche SQL Server HierarchyId Datentyp mit Entity Framework zu verwenden. Da Entity Framework Unterstützung für Typ hierarchyid Daten nicht ich bin mit Gabel Entity Framework, die Unterstützung hierarchyid hat: https://entityframework.codeplex.com/SourceControl/network/forks/zgabi/EfHierarchyId/latestEntity Framework 6.1.3 Hierarchie-ID funktioniert nicht
DB Tabelle ist wie folgt:
CREATE TABLE OrgStructure(
[Id] [hierarchyid] NOT NULL,
[Level] AS ([Id].[GetLevel]()),
[NodeId] [int] IDENTITY(1,1) NOT NULL,
[Title] [varchar](50) NULL)
Meine Entity, die hierarchyid Datentyp verwendet wird definiert folgt:
public class OrgStructure
{
public HierarchyId Id { get; set; }
public Nullable<int> Level { get; set; }
public int NodeId { get; set; }
public string Title { get; set; }
}
und EntityFramework Mapping-Konfiguration ist wie folgt definiert:
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 ist wie folgt:
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());
}
}
Registrierte DbContext in startup.cs als
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<VisibilityHierarchyDBContext>((s) => new VisibilityHierarchyDBContext(Configuration.GetConnectionString("VisibilityDB")));
// Add framework services.
services.AddMvc();
}
Mit DbContext folgt wie folgt:
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();
}
}
Ich erhalte in Index folgende Fehler oben gezeigte Aktion:
Die Eigenschaft 'Id' in 'OrgStructure' konnte nicht auf einen Wert 'Microsoft.SqlServer.Types.SqlHierarchyId' festgelegt werden. Sie müssen diese -Eigenschaft auf einen Nicht-Null-Wert des Typs 'System.Data.Entity.Hierarchy.HierarchyId' festlegen.
Jede Hilfe, um diesen Fehler zu beheben, wird sehr geschätzt.
Können Sie ein Beispiel dafür geben, wie Sie der 'OrgStructure' Tabelle neue Zeilen hinzufügen? – nocodename
@nocodename: Ich habe die Tabelle manuell gefüllt und versucht, vorhandene Daten mithilfe von DbContext abzurufen. –
Etwas, das ich gerade bemerkt habe - sollte 'Id' Eigenschaft als' IsOptional() 'gesetzt werden? Haben Sie versucht, es mit 'Computed' DatabaseGeneratedOption wie gewünscht abzubilden? – nocodename