2017-08-31 1 views
0

ich ein Problem, das Einfügen mit Entity Framework von Child-Objekt habe 6.Entity Framework Einfügen Datensatz mit zusammengesetzten Schlüssel Einfügen nicht zweiten Feld

Ich habe zwei Klassen:

public class RoleInstance 
{ 
    [Key, Column(Order = 1)] 
    public long RoleId { get; set; } 
    [Key, Column(Order = 2)] 
    public string EnvirCode { get; set; } 

    public int PathId { get; set; } 

    public char Published { get; set; } 

    [ForeignKey("RoleId")] 
    public virtual Role Role { get; set; } 
    [ForeignKey("PathId")] 
    public virtual RoutingPath RoutingPath { get; set; } 
    [ForeignKey("EnvirCode")] 
    public virtual Environment Environment { get; set; } 

    public ICollection<ActiveDirectoryGroup> ActiveDirectoryGroups { get; set; } 
} 

public class ActiveDirectoryGroup 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    [Column(Order = 1), Key] 
    public long RoleId { get; set; } 
    [Column(Order = 2), Key] 
    public string EnvirCode { get; set; } 
    public string GroupName { get; set; } 
    public string GroupGuid { get; set; } 
    public char AuditGroup { get; set; } 

    [ForeignKey("RoleId,EnvirCode")] 
    public virtual RoleInstance RoleInstance { get; set; } 
} 

Ich versuche einfügen ein Datensatz mit Code wie folgt:

RoleInstance ri = new RoleInstance { RoleId = 1, 
            EnvirCode = "ENVIR", 
            PathId = 5, 
            Published = 'Y' 
            ActiveDirectoryGroups = new List<ActiveDirectoryGroups>() 
}; 

ri.ActiveDirectoryGroups.Add(new ActiveDirectoryGroup() { 
GroupName = "GROUP NAME", 
AuditGroup = 'Y' 
}; 

_db.Context.Add(ri); 

Dann, wenn ich es speichern, den Datensatz in RoleInstance Fein fügt das Entity Framework stellt nicht die EnvirCode in der ActivityDirectoryGroup. Diese

ist, was meine modelBuilder wie folgt aussieht:

modelBuilder.Entity<ActiveDirectoryGroup>() 
      .HasRequired(e => e.RoleInstance) 
      .WithMany(e => e.ActiveDirectoryGroups) 
      .HasForeignKey(e => new {e.RoleId, e.EnvirCode}); 

Antwort

0

A RoleInstance nicht mehrere ActiveDirectoryGroups, wenn der Schlüssel für beide haben kann, ist (RoleId, EnvirCode). Wechseln Sie den Schlüssel für ActiveDirecoryGroups zu Id oder (RoleId, EnvirCode, Id) für eine Eins-zu-viele-Beziehung. Und Sie sollten Fluent und Attribut-basiertes Mapping hier nicht mischen müssen.

Hier ist ein Arbeitsmodell:

using System; 
using System.Linq; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.Data.Entity; 

namespace Ef6Test 
{ 

    public class Role 
    { 
     public long RoleId { get; set; } 
    } 
    public class RoutingPath 
    { 
     public int RoutingPathId { get; set; } 
    } 
    public class Environment 
    { 
     public string EnvironmentId { get; set; } 
    } 
    public class RoleInstance 
    { 
     [Key, Column(Order = 1)] 
     public long RoleId { get; set; } 
     [Key, Column(Order = 2)] 
     public string EnvirCode { get; set; } 

     public int PathId { get; set; } 

     public char Published { get; set; } 

     [ForeignKey("RoleId")] 
     public virtual Role Role { get; set; } 
     [ForeignKey("PathId")] 
     public virtual RoutingPath RoutingPath { get; set; } 
     [ForeignKey("EnvirCode")] 
     public virtual Environment Environment { get; set; } 

     public ICollection<ActiveDirectoryGroup> ActiveDirectoryGroups { get; } = new HashSet<ActiveDirectoryGroup>(); 
    } 

    public class ActiveDirectoryGroup 
    { 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity), Key] 
     public int Id { get; set; } 

     public long RoleId { get; set; } 

     public string EnvirCode { get; set; } 
     public string GroupName { get; set; } 
     public string GroupGuid { get; set; } 
     public char AuditGroup { get; set; } 

     [ForeignKey("RoleId,EnvirCode")] 
     public virtual RoleInstance RoleInstance { get; set; } 
    } 

    class Db : DbContext 
    { 

     public DbSet<ActiveDirectoryGroup> ActiveDirectoryGroups { get; set; } 
     public DbSet<RoleInstance> RoleInstances { get; set; } 


     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      base.OnModelCreating(modelBuilder); 
     } 

    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Database.SetInitializer(new DropCreateDatabaseAlways<Db>()); 

      using (var db = new Db()) 
      { 
       db.Database.Initialize(false); 

       db.Database.Log = msg => Console.WriteLine(msg); 

       RoleInstance ri = new RoleInstance 
       { 
        Role = new Role() { RoleId = 1}, 
        Environment = new Environment() { EnvironmentId = "ENVIR" }, 
        RoutingPath = new RoutingPath() { RoutingPathId = 5 }, 
        Published = 'Y' 
       }; 

       ri.ActiveDirectoryGroups.Add(new ActiveDirectoryGroup() 
       { 
        GroupName = "GROUP NAME", 
        AuditGroup = 'Y' 
       }); 

       db.RoleInstances.Add(ri); 
       db.SaveChanges(); 


      } 

      using (var db = new Db()) 
      { 
       foreach (var g in db.ActiveDirectoryGroups) 
       { 
        Console.WriteLine($"RoleId: {g.RoleId}, EnvirCode: { g.EnvirCode}"); 
       } 
      } 

      Console.ReadKey(); 
     } 
    } 
} 
+0

Danke, das wies darauf hin, was ich falsch mache. In dem von Ihnen bereitgestellten Beispiel würden wir einen Datensatz in der Environment-Tabelle erstellen oder würde der Entitätsrahmen diese Referenz suchen? Ich habe den Code zu arbeiten, wenn ich entweder das Feld Umgebung im Code aufgefüllt oder wenn ich diese Fremdschlüssel Referenz in der RoleInstance-Klasse entfernt habe. Danke, –

Verwandte Themen