2016-04-02 9 views
0

Erstellen einer Webanwendung mit MVC5 unter Verwendung des ersten Modellierungsansatzes der Datenbank. Leider hat die existierende Datenbank, aus der ich baue, eine Tabelle, die Fremdschlüsselbeschränkungen fehlt, zusätzliche Primärschlüssel hat und im Allgemeinen nicht gut ausgebildet ist. Wenn ich das MVC-Modell erstelle, kann es daher nicht automatisch alle erforderliche viele zu viele Beziehungen zwischen den Tabellen generieren. Ich kann die Definition der ursprünglichen Tabelle nicht ändern.MVC Bearbeiten von Modellbeziehungen aus der Datenbank zuerst

Ich entdeckte die Fähigkeit, neue Assoziationen über das MVC-Modelldiagramm und den Modellbrowser zu erstellen, aber es scheint mir nur zu ermöglichen, die Tabellen zuzuordnen und die Felder nicht anzugeben, die sie verbinden. Wenn ich das Modell aktualisiere, erhalte ich Fehler bei den von mir erstellten Zuordnungen, die nicht zugeordnet sind, ohne Details.

Alle Beispiele, die ich für die erste Modellierung der Datenbank finden kann, beginnen mit wohlgeformten und gut benannten Tabellen, was im wirklichen Leben nicht immer der Fall ist.

Kann mir jemand erklären oder auf einen Link verweisen, wie man mit einem ersten Datenbankmodell beginnt, aber dann die Probleme behebt oder die fehlenden Teile definiert, damit das MVC-Modell korrekt erstellt werden kann?

Oder vielleicht für diese eine Tabelle, sollte ich nur die Klasse direkt modellieren? Der einzige Teil dessen, den ich nicht verstehe, ist, wo ich die Details der Navigationseigenschaften definiere, damit das Modell weiß, welche Tabellen und Felder zu verbinden sind.

+0

fand ich diese auf SO: http://stackoverflow.com/a/10237219/1582931. Etwas von einer Datenbank/Code zuerst Hybrid-Ansatz. Eine weitere Option wäre, den vollständigen EF-Code zuerst in einer vorhandenen Datenbank (https://channel9.msdn.com/Blogs/EF/Code-First-to-Existing-Database-EF6-1-Onwards-) zu verwenden und zu verwenden die Fluent-API zum Konfigurieren von EF (https://msdn.microsoft.com/en-us/data/jj591617.aspx). – dotnetesse

Antwort

0

Gerichtet durch den obigen Kommentar, habe ich schließlich einen viel besseren Ansatz zum Erstellen einer MVC-App für eine vorhandene Datenbank ermittelt, die möglicherweise nicht so entworfen wurde, wie Sie Ihr Modell erstellen möchten.

Ich verwende einen CodeFirst-Ansatz, um die Model-Klassen direkt zu definieren, anstatt sie aus der vorhandenen Datenbank zu generieren. Mit den Mapping-Eigenschaften von Entity Framework ordnet ich dann jede Klasse und ihre individuellen Eigenschaften der vorhandenen Tabelle und den vorhandenen Feldern zu. Dadurch kann ich die Klasse definieren, die ich möchte, geben Sie ihr die Eigenschaftsnamen, die ich möchte, und definieren Sie die Fremdschlüssel, die möglicherweise nicht in der Datenbank definiert sind.

Hier sind einige Beispiele für Klassen, die ich erstellt habe und die vorhandenen Datenbanktabellen zugeordnet sind.

[Table("uofs00137_contacts")] 
public partial class Contact 
{ 
    [Key] 
    [Column("id")] 
    public int ID { get; set; } 

    [Column("first_name")] 
    [StringLength(30)] 
    [Display(Name = "First Name")] 
    public string FirstName { get; set; } 

    [Column("last_name")] 
    [StringLength(30)] 
    [Display(Name = "Last Name")] 
    public string LastName { get; set; } 

    [Column("organisation")] 
    [StringLength(30)] 
    [Display(Name = "Organization")] 
    public string Organization { get; set; } 

    [Column("title")] 
    [StringLength(30)] 
    [Display(Name = "Job Title")] 
    public string JobTitle { get; set; } 

    [Column("email")] 
    [StringLength(40)] 
    [Display(Name = "Email")] 
    public string Email { get; set; } 

    [Column("status_code")] 
    [StringLength(1)] 
    [Required] 
    [Display(Name = "Contact Status Code")] 
    public string StatusCode { get; set; } 

    [Display(Name = "Full Name")] 
    public string FullName 
    { 
     get 
     { 
      return FirstName + " " + LastName; 
     } 
    } 

    public virtual ICollection<DepartmentContact> DepartmentContacts { get; set; } 
} 

[Table("uofs00137_dept_contacts")] 
public partial class DepartmentContact 
{ 
    [Key] 
    [Column("id")] 
    public int ID { get; set; } 

    [Column("department_code")] 
    [StringLength(7)] 
    [ForeignKey("VirtualDepartment")] 
    [Display(Name = "Department Code")] 
    public string DepartmentCode { get; set; } 

    [Column("contact_id")] 
    [ForeignKey("Contact")] 
    [Display(Name = "Contact ID")] 
    public int ContactID { get; set; } 

    [Column("status_code")] 
    [StringLength(1)] 
    [Required] 
    [Display(Name = "Department Contact Status Code")] 
    public string StatusCode { get; set; } 

    [Display(Name = "Department Contact Status")] 
    public string StatusDesc 
    { 
     get 
     { 
      if (StatusCode == "I") 
       return "Inactive"; 
      else if (StatusCode == "A") 
       return "Active"; 
      else 
       return "Unknown Status"; 
     } 
    } 

    public virtual VirtualDepartment VirtualDepartment { get; set; } 
    public virtual Contact Contact { get; set; } 
} 

Die Verbindung zur Datenbank wird über eine DbContext Klasse gemacht:

public partial class AccountingAdminEntities : DbContext 
{ 
    public AccountingAdminEntities() : base("name=AccountingAdminEntities") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // This is necessary so that as you add new items to the context 
     // you don't get the following exception: 
     // The model backing the AccountingAdminEntities context has 
     // changed since the database was created. Consider using Code 
     // First Migrations to update the database. 
     Database.SetInitializer<AccountingAdminEntities>(null); 
     base.OnModelCreating(modelBuilder); 
    } 

    public virtual DbSet<Contact> Contacts { get; set; } 
    public virtual DbSet<DepartmentContact> DepartmentContacts { get; set; } 
} 

Entity Framework einige Konventionen folgt bestimmte Eigenschaften, wie zum Beispiel ein Feld-ID ein Schlüssel mit dem Namen zu „übernehmen“ wird, aber Ich habe entschieden, alle Mapping-Eigenschaften explizit zu definieren.

Mit diesem Ansatz konnte ich mein Ziel erreichen, eine MVC-App für eine vorhandene Datenbank zu generieren und unsere Namenskonventionen zu befolgen, ohne die Datenbank ändern oder Fremdschlüsseleinschränkungen hinzufügen zu müssen.

Weitere Referenz Links: https://blogs.msdn.microsoft.com/efdesign/2010/06/01/conventions-for-code-first/

und hier: https://msdn.microsoft.com/en-us/data/jj591617.aspx#1.1

Verwandte Themen