Fremdschlüssel in Entity Framework v1 hinzufügen und aktualisieren

entity-framework foreign-keys

Frage

Ich verwende .NET 3.5 SP1. Ich habe die Entität "Category" erstellt, basierend auf der Tabelle "category_table" und "MyUser", basierend auf der Tabelle "App_User_table".

CREATE TABLE category_table (
 catg_id int,
 catg_name varchar(50),
 catg_description varchar(250)
 )

CREATE TABLE App_User_table (
 userid int,
 username varchar(50),
 fullname varchar(50), catg_id int,
 fullAddress varchar(200),
 comments varchar(1000),CONSTRAINT FK_1 FOREIGN KEY (catg_id) REFERENCES Category_table (catg_id) 
)

public class Category: System.Data.Objects.DataClasses.EntityObject{    
 public int  CategoryId{get; set;}   
 public string CategoryName {get; set;} 
  ....
}

public class AppUser : System.Data.Objects.DataClasses.EntityObject{   
 public int Uid {get; set;}   
 public string UserName {get; set;}   
 public string Name {get; set;}   
 public string Address {get; set;}
 public string Comment {get; set;} 
 public Category category_table  { .. } 
 public System.Data.Objects.DataClasses.EntityReference<Category> category_tableReference {...}
 ...........   
}

Ich möchte die AppUser-Entität in einer ASP.NET-MVC-Anwendung hinzufügen und aktualisieren.

Für hinzufügen:

//create entity with passed values
AppUser user = new AppUser(){Uid=id, ....  }
//Set EntityReference
user.category_tableReference.EntityKey = new System.Data.EntityKey("MyContext.CategorySet", "CategoryId", categoryIdSelected);
myContext.AddToCategorySet(user);
myContext.SaveChanges(true);

Für Update:

//create entity with passed Id 
AppUser user = new AppUser(){Uid=id  }
//Attach entitymyContext.AttachTo("UserSet", user);
//Update entity with passed values
user.Address = addr;
....

// ausgewählte CategoryId aus DropDownList aktualisieren

user.category_tableReference.EntityKey = new System.Data.EntityKey("MyContext.CategorySet", "CategoryId", categoryId);

Update-Methode aktualisiert CategoryId in der Datenbank NICHT.

Bitte sagen Sie uns, wie Sie das Problem am besten lösen können.

Vielen Dank.

Akzeptierte Antwort

Hier ist der Ansatz, den ich für das Update in einer MVC-App verwenden würde:

// Put the original Stub Entities for both the original User and its 
// original category. The second part is vital, because EF needs to know 
// original FK values to successfully do updates in 3.5 SP1
AppUser user = new AppUser {
    Uid = id, 
    Category = new Category {
        CategoryId = OriginalCategoryID
    }
};
ctx.AttachTo("UserSet", user);

// Then do this:
if (user.Category.CategoryId != categoryIdSelected)
{
    Category newCategory = new Category {CategoryId = CategoryIdSelected};
    // Attach because I assume the category already exists in the database
    ctx.AttachTo("CategorySet", newCategory);
    user.Category = newCategory;
}

// Update entity with passed values
user.Address = addr;
....

Da Sie sehen können, dass Sie OriginalCategoryID von irgendwo abrufen müssen, empfehle ich ein ausgeblendetes Feld im Formular.

Dies wird alles tun, was Sie brauchen. Tipp 26 - So vermeiden Sie Datenbankabfragen mit Stub-Entitäten, um weitere Informationen zum Stub-Entity-Trick zu erhalten.

Hoffe das hilft

Alex


Beliebte Antwort

UPDATE: siehe Kommentare von Craig Stuntz und Alex James - ich stehe korrigiert - es scheint möglich, den "EntityKey" einfach zu aktualisieren, um das zu erreichen, was Sie gewünscht haben. Mein Post hier gilt nicht mehr

In Version 1 kann Entity Framework nicht nur mit dem Einfügen von Fremdschlüsselwerten arbeiten. Sie müssen die Objektinstanz "Category" zur Cateogry-Navigationseigenschaft "AppUser" hinzufügen:

//create entity with passed values
AppUser user = new AppUser(){Uid=id, ....  }

// set the Category navigation property
Category newUserCategory  = Category.GetbyID(4); // or whatever you need
user.Category = newUserCategory;

myContext.AddToCategorySet(user);
myContext.SaveChanges(true);

Mit EF v4, das später in diesem Jahr (2009) mit .NET 4.0 ausgeliefert wird, können Sie dann nur den Fremdschlüsselwert festlegen, um Assoziationen zwischen zwei Entitäten zu ermöglichen.

Weitere Informationen dazu finden Sie hier:

Für den Moment müssen Sie jedoch das vollständige Objekt festlegen. Die Referenz ist jedoch nicht ausreichend.

Marc



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum