2017-02-06 9 views
0

Ich habe es Setup mit einem der Hauptnutzer basiert wegEntity Framework 6 Foreign Key Ausgabe

public class User{ 
    [Key] 
    public int UserId {get;set;} 

    public virtual ICollection<Sub_User> SubUser {get;set;} 
    //Other 
} 

und dann eine andere Art von Benutzer Benutzer einsehen.

public class Sub_User{ 
    [Key] 
    public int Sub_User_ID {get;set;} 

    int UserID {get;set;} //Foreign Key to User in DB 
    public virtual User User {get;set;} 
    //Other 
} 

Ich kann es nicht richtig funktionieren, es sei denn ich habe es wie folgt eingerichtet.

modelBuilder.Entity<User>() 
      .HasMany(e => e.Sub_Users) 
      .WithRequired(e => e.User) 

Das funktioniert so. Aber das Problem, das ich habe, ist, warum brauche ich eine ICollection des Unteranwenders? Ich habe gerade die es versuche, wie

 public virtual Sub_User SubUser {get;set;} 

und dann zu verändern, wie es in dem Modellbauer funktioniert, aber es funktioniert nicht richtig und ich Fehler bekommen.

Der Hauptbenutzer sollte nur 1 Sub_User haben, also finde ich es seltsam, dass die einzige Lösung online ist und der einzige Weg, wie ich es richtig funktionieren kann, ist mit einer Sammlung.

Antwort

0

Unten finden Sie einige Optionen, um das zu erreichen, wonach Sie suchen. Wo Sub_User binden an gültige/bestehende User und User hat höchstens eine Sub_User. Die Verwendung der Annotation [required] in Option 3 scheint am saubersten zu sein und erfordert keine Fluent-API-Konfiguration.

Option 1)

hinzufügen [ForeignKey] Anmerkung zur int UserId Eigenschaft Sub_User

public class User { 
    [Key] 
    public int UserId { get; set; } 

    public virtual Sub_User SubUser { get; set; } 
} 

public class Sub_User{ 
    [Key] 
    public int Sub_User_ID { get; set; } 

    [ForeignKey("User")] 
    public int UserID { get; set; } 

    public virtual User User { get; set; } 
} 

Option 2)

fliessend API (mit [ForeignKey] und UserId entfernt):

public class User { 
    [Key] 
    public int UserId { get; set; } 

    public virtual Sub_User SubUser { get; set; } 
} 

public class Sub_User{ 
    [Key] 
    public int Sub_User_ID { get; set; } 

    public virtual User User { get; set; } 
} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    // Configure UserId as FK for Sub_User 
    modelBuilder.Entity<User>() 
       .HasOptional(u => u.SubUser) 
       .WithRequired(su => su.User); 
} 

Option 3)

Sie könnten auch ohne Fluent API, versuchen Sie [erforderlich] Datenaufbelichtung auf der User User Eigenschaft Sub_User und Entfernen der int UserId Eigenschaft und [ForeignKey] Anmerkung:

public class Sub_User{ 
    [Key] 
    public int Sub_User_ID { get; set; } 

    [Required] 
    public virtual User User { get; set; } 
} 

Update:

Ich habe eine erstellt MVC 5 EF 6 Projekt kosten und mit den Tasten [Erforderlich] Tag, generierten Code zuerst die folgenden Tabellen aus diesen Klassen:

C#

public class User 
{ 
    [Key] 
    public int UserId { get; set; } 

    public string Name { get; set; } 

    public virtual Sub_User SubUser { get; set;} 
} 

public class Sub_User 
{ 
    [Key] 
    public int Sub_User_ID { get; set; } 

    public string Name { get; set; } 

    [Required] 
    public virtual User User { get; set; } 

} 

SQL:

CREATE TABLE [dbo].[User] (
    [UserId] INT   IDENTITY (1, 1) NOT NULL, 
    [Name] NVARCHAR (MAX) NULL, 
    CONSTRAINT [PK_dbo.User] PRIMARY KEY CLUSTERED ([UserId] ASC) 
); 

CREATE TABLE [dbo].[Sub_User] (
    [Sub_User_ID] INT   NOT NULL, 
    [Name]  NVARCHAR (MAX) NULL, 
    CONSTRAINT [PK_dbo.Sub_User] PRIMARY KEY CLUSTERED ([Sub_User_ID] ASC), 
    CONSTRAINT [FK_dbo.Sub_User_dbo.User_Sub_User_ID] FOREIGN KEY ([Sub_User_ID]) REFERENCES [dbo].[User] ([UserId])); 


GO CREATE NONCLUSTERED INDEX [IX_Sub_User_ID] 
    ON [dbo].[Sub_User]([Sub_User_ID] ASC); 

Ich war in der Lage zu retten Benutzerelemente sowohl mit einem Sub_User und ohne Sub_User, wie in Sub_User SubUser sind optional für ein User Objekt:

var users = new List<User>() 
{ 
    new User { Name = "Foo", SubUser = new Sub_User { Name = "Bar" } }, 
    new User { Name = "FooBar" } 
}; 

users.ForEach(u => context.Users.Add(u)); 

context.SaveChanges(); 

Wenn Sie versuchen, eine Sub_User ohne gültige hinzufügen/bestehende User es fehlschlägt, die folgende nicht zum Beispiel:

var subUsers = new List<Sub_User>() 
{ 
    new Sub_User { Name= "Unicorn" } 
}; 

subUsers.ForEach(su => context.SubUsers.Add(su)); 

context.SaveChanges(); 

Probe Kontext:

public class SampleContext : DbContext { 

    public SampleContext() : base("SampleContext") {} 

    public DbSet<User> Users { get; set; } 
    public DbSet<Sub_User> SubUsers { get; set; } 
} 

Hoffentlich hilft!

+0

Diese Arbeit schien, aber ich hatte das .WithRequired setzen (su => su.User) Ich bin immer noch nicht sicher, warum dies funktioniert, obwohl haha. – Dylan

+0

Freut mich zu hören, dass es für dich funktioniert hat! –

+0

auf den zweiten Gedanken, das legt den Primärschlüssel auf den Fremdschlüssel .. was nicht funktionieren wird. – Dylan

0

Es könnte so einfach sein wie Sub_User.UserID öffentlich zu machen. Ansonsten, so etwas wie dies funktionieren könnte:

public int UserID; 

[NotMapped] 
public User User 
{ 
    get 
    { 
     return _context.Users.where(u=>u.UserID==UserID).FirstOrDefault(); 
    } 
    set 
    { 
     UserID = value.UserID; 
    } 

}