Entity framework 在实体框架中更新外键

Entity framework 在实体框架中更新外键,entity-framework,foreign-keys,Entity Framework,Foreign Keys,我创建了一个实体的分部类,用于获取该实体的外键属性 public partial class Artikel { public int WarengruppenID { get { if (WarengruppeReference.EntityKey == null) return 0; return (int)WarengruppeReference.EntityKey.EntityKeyValue

我创建了一个实体的分部类,用于获取该实体的外键属性

public partial class Artikel
{
    public int WarengruppenID
    {
        get
        {
            if (WarengruppeReference.EntityKey == null) return 0;
            return (int)WarengruppeReference.EntityKey.EntityKeyValues[0].Value;
        }
        set
        {
            WarengruppeReference.EntityKey =
                new EntityKey("ConsumerProtectionEntities.Warengruppe", "WarengruppenID", value);

        }
    }
}
现在我更改了外键(属性),但什么也没发生

更新实体的外键需要做什么

我在ASP.NETMVC2中使用EF3.5SP1

编辑

id=ArtikelID updatedArtikel=Artikel属性 ArtikelWarengruppen=选定的下拉列表值

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, Artikel updatedArtikel, string ArtikelWarengruppen)
{
    try
    {
        int artikelWarengruppenID = int.Parse(ArtikelWarengruppen);

        var originalArtikel = (from art in _db.Artikel.Include(typeof(Warengruppe).Name)
                               where art.ArtikelID == id
                               select art).FirstOrDefault();

        _db.Attach(originalArtikel);

        updatedArtikel.ArtikelID = id;

        // Update FK
        updatedArtikel.WarengruppenID = artikelWarengruppenID;

        _db.ApplyPropertyChanges(typeof(Artikel).Name, updatedArtikel);

        _db.SaveChanges();

        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

我已经解决了这个问题

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, Artikel updatedArtikel, string ArtikelWarengruppen)
{
    try
    {
        // update foreign key
        int artikelWarengruppenID = int.Parse(ArtikelWarengruppen);

        var originalArtikel = (from art in _db.Artikel.Include(typeof(Warengruppe).Name)
                               where art.ArtikelID == id
                               select art).FirstOrDefault();

        originalArtikel.WarengruppenID = artikelWarengruppenID;

        _db.Attach(originalArtikel);

        // update properties
        updatedArtikel.ArtikelID = id;

        _db.ApplyPropertyChanges(typeof(Artikel).Name, updatedArtikel);

        _db.SaveChanges();

        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

但是有更好的方法吗?

这应该是实现您想要的最佳方法:

int artikelWarengruppenID = int.Parse(ArtikelWarengruppen);
updatedArtikel.WarengruppenID = artikelWarengruppenID;
updatedArtikel.ArtikelID = id;

_db.Entry(updatedArtikel).State = EntityState.Modified;
_db.SaveChanges();

这确实假设您发布的
Artikel
包含您希望保留在实体中的所有数据。

您能否澄清,“现在我更改了外键(属性),但什么都没有发生?”如果您更改
WarengruppenID=…
ApplyPropertyChanges
的顺序会发生什么?它什么都没有发生,仍然是一样的,没有向数据库发送任何语句