2017-04-26 1 views
1

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.

+0

Können Sie ein Beispiel dafür geben, wie Sie der 'OrgStructure' Tabelle neue Zeilen hinzufügen? – nocodename

+0

@nocodename: Ich habe die Tabelle manuell gefüllt und versucht, vorhandene Daten mithilfe von DbContext abzurufen. –

+0

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

Antwort

1

Ich fand es heraus. Eigentlich ist die Fehlermeldung etwas irreführend. Als ich die Eigenschaft "Level" aus der Entity-Definition und dem Mapping entfernte, funktionierte es wie ein Zauber. Es wurde abgebrochen, weil die Level-Spalte als berechnete Spalte definiert ist, die automatisch Smallint als Datentyp wählt, während der Typ in der Entity-Definition int ist.

0

Haben Sie versucht, Computed als DatabaseGeneratedOption anstelle von None zu verwenden?

+0

Ich habe versucht, es auf Computed zu setzen, aber es hat nicht geholfen. –

Verwandte Themen