2016-07-10 17 views
0

Angenommen, die folgenden beiden Tabellen:Entity Framework Database Erstens: Fremdschlüssel zum eindeutigen Schlüssel wird nicht automatisch von Entity Framework abgebildet

CREATE TABLE [dbo].[Users] 
(
    [UserId] VARCHAR(36) NOT NULL PRIMARY KEY, /*Using GUID IDs for better identification*/ 
    [Email] NVARCHAR(50) NOT NULL UNIQUE, 
    ...... 
) 

CREATE TABLE [dbo].[UserLogins] 
(
    [Email] NVARCHAR(50) NOT NULL PRIMARY KEY, 
    [Password] VARCHAR(32) NOT NULL, 
    ..... 
    CONSTRAINT [UserLogins_Users_FK] FOREIGN KEY(Email) REFERENCES [Users](Email) ON DELETE CASCADE 
) 

Wenn die EF automatische Zuordnung von Datenbank, die Users Tabelle auf dem nicht abgebildet ist UserLogins Tabelle. Unter der Annahme, dass es nicht möglich ist, die einzigartige und Primärschlüssel rückgängig zu machen, und ich brauche, dies zu tun, dass sehr wenig Speicherbereich zu speichern als VARCHAR(36) kleiner als NVARCHAR(50) ist, was wäre die richtige Lösung, EF zu erzwingen automatisch diese beiden Tabellen abzubilden?

+1

der einzige Weg ist EF zu sagen, dass Users.Email der Primärschlüssel ist. –

+0

@GertArnold: Wie genau kann ich dies tun, wenn die Datenbank automatisch zugeordnet wird und das Tischmodell wird automatisch generiert? – Arrrr

+0

@GertArnold: Und das ist nicht möglich, da Users.Email kein Primärschlüssel ist. – Arrrr

Antwort

-2

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])) 
+0

Die 1: n-Zuordnung ist umgekehrt. –

Verwandte Themen