try Rabatt-Code First (Es hat Test erfolgreich auf meinem lokalen Computer):
public class Users
{
public int UserId { get; set; }
public string Emails { get; set; }
public UserLogins UserLogins { get; set; }
}
public class UserLogins
{
public string Email { get; set; }
public string Password { get; set; }
public ICollection<Users> Users { get; set; }
}
public class UsersMap : EntityTypeConfiguration<Users>
{
public UsersMap()
{
this.HasKey(x => x.UserId);
this.Property(x => x.Emails).HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute() { IsUnique = true }));
this.HasRequired(x => x.UserLogins).
WithMany(x => x.Users).HasForeignKey(x => x.Emails);
}
}
public class UserLoginMap : EntityTypeConfiguration<UserLogins>
{
public UserLoginMap()
{
this.HasKey(x => x.Email);
}
}
public class TotalDbContext : DbContext
{
public TotalDbContext()
: base("Name=total")
{
}
public DbSet<Users> Users { get; set; }
public DbSet<UserLogins> UserLogins { get; set; }
protected override void OnModelCreating(DbModelBuilder model)
{
model.Configurations.Add(new UsersMap());
model.Configurations.Add(new UserLoginMap());
}
}
dann wird es Code erstellen belows:
public override void Up()
{
CreateTable(
"dbo.UserLogins",
c => new
{
Email = c.String(nullable: false, maxLength: 128),
Password = c.String(),
})
.PrimaryKey(t => t.Email);
CreateTable(
"dbo.Users",
c => new
{
UserId = c.Int(nullable: false, identity: true),
Emails = c.String(nullable: false, maxLength: 128),
})
.PrimaryKey(t => t.UserId)
.ForeignKey("dbo.UserLogins", t => t.Emails, cascadeDelete: true)
.Index(t => t.Emails, unique: true);
}
es Tabellen wie diese schaffen:
CREATE TABLE [dbo].[UserLogins] (
[Email] [nvarchar](128) NOT NULL,
[Password] [nvarchar](max),
CONSTRAINT [PK_dbo.UserLogins] PRIMARY KEY ([Email]))
CREATE TABLE [dbo].[Users] (
[UserId] [int] NOT NULL IDENTITY,
[Emails] [nvarchar](128) NOT NULL,
CONSTRAINT [PK_dbo.Users] PRIMARY KEY ([UserId]))
CREATE UNIQUE INDEX [IX_Emails] ON [dbo].[Users]([Emails])
ALTER TABLE [dbo].[Users] ADD CONSTRAINT [FK_dbo.Users_dbo.UserLogins_Emails] FOREIGN KEY ([Emails]) REFERENCES [dbo].[UserLogins] ([Email]) ON DELETE CASCADE
CREATE TABLE [dbo].[__MigrationHistory] (
[MigrationId] [nvarchar](150) NOT NULL,
[ContextKey] [nvarchar](300) NOT NULL,
[Model] [varbinary](max) NOT NULL,
[ProductVersion] [nvarchar](32) NOT NULL,
CONSTRAINT [PK_dbo.__MigrationHistory] PRIMARY KEY ([MigrationId], [ContextKey]))
der einzige Weg ist EF zu sagen, dass Users.Email der Primärschlüssel ist. –
@GertArnold: Wie genau kann ich dies tun, wenn die Datenbank automatisch zugeordnet wird und das Tischmodell wird automatisch generiert? – Arrrr
@GertArnold: Und das ist nicht möglich, da Users.Email kein Primärschlüssel ist. – Arrrr