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!
Diese Arbeit schien, aber ich hatte das .WithRequired setzen (su => su.User) Ich bin immer noch nicht sicher, warum dies funktioniert, obwohl haha. – Dylan
Freut mich zu hören, dass es für dich funktioniert hat! –
auf den zweiten Gedanken, das legt den Primärschlüssel auf den Fremdschlüssel .. was nicht funktionieren wird. – Dylan