ADO.Net實體框架IEntityChangeTracker的多個實例不能引用實體對象

ado.net c# entity-framework

我正在嘗試保存我的聯繫人,其中提到了ContactRelation(只是聯繫人,已婚,單身等的關係)和國家。但每當我嘗試保存我的聯繫人時,我都會得到例外“ADO.Net實體框架實例對像不能被IEntityChangeTracker的多個實例引用”

public Contact CreateContact(Contact contact)
{
    _entities.AddToContact(contact); //throws the exception
    _entities.SaveChanges();
    return contact ;
}

我正在使用鬆散耦合的MVC設計與服務和存儲庫。我已經閱讀了很多關於這個例外的帖子,但沒有一個給我一個有效的答案......

謝謝你,彼得

一般承認的答案

[更新]
由於使用了L2E,因此您需要先保存所有鏈接的對象,然後才能保存主對象。這是有道理的,否則你會創建(在我的例子中)沒有它的聯繫對象的藝術家。數據庫設計不允許這樣做。
[/更新]

這是我的實施工作。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude = "Id")] Artist artist, [Bind(Prefix = "Contact")] Contact contact, [Bind(Prefix = "Country")] Country country, [Bind(Prefix = "ContactRelationship")] ContactRelationship contactRelationship)
{
    ViewData["Countries"] = new SelectList(new CountryService(_msw).ListCountries().OrderBy(c => c.Name), "ID", "Name");
    ViewData["ContactRelationships"] = new SelectList(new ContactRelationshipService(_msw).ListContactRelationships().OrderBy(c => c.ID), "ID", "Description");

    country = _countryService.GetCountryById(country.ID);
    contact.Country = country;
    contactRelationship = _contactRelationshipService.GetContactRelationship(contactRelationship.ID);
    contact.ContactRelationship = contactRelationship;
    if(_contactService.CreateContact(contact)){
        artist.Contact = contact;
        if (_service.CreateArtist(artist))
            return RedirectToAction("Index");        
    }
    return View("Create");
}

然後在我的ContactRepository中:

public Contact CreateContact(Contact contact)
{
    _entities.AddToContact(contact); //no longer throws the exception
    _entities.SaveChanges();
    return contact ;
}

我還在這個網站上發現最好在整個應用程序中保持相同的上下文,所以我現在使用一個特殊的Data類:

Rick Strahl和Samuel Maecham告訴我你應該按照每個用戶的請求保留你的datacontext。這意味著將它放在Web應用程序的HttpContext中。 在這裡閱讀所有相關信息

public class Data
{
    public static MyDBEntities MyDBEntities
    {
        get
        {
            if (HttpContext.Current != null && HttpContext.Current["myDBEntities"] == null)
            {
                HttpContext.Current["myDBEntities"] = new MyDBEntities ();
            }
            return HttpContext.Current["myDBEntities"] as MyDBEntities;
        }
        set { 
            if(HttpContext.Current != null)
                HttpContext.Current["myDBEntities"] = value; 
        }
    }
}

熱門答案

我以前見過這個,你可能必須在保存之前將Reference字段轉換為EntityKey,然後在保存之後加載它。請嘗試使用此代碼:

public Contact CreateContact(Contact contact){
    contact.ConvertContactRelationToReference();
    _entities.AddToContact(contact); 
    //throws the exception
    _entities.SaveChanges();
    contact.ContactRelation.Load();
    return contact;
}

public partial class Contact
{
  public void ConvertContactRelationToReference()
  {
    var crId = ContactRelation.Id;
    ContactRelation = null;
    ContactRelationReference.EntityKey = new EntityKey("MyEntities.ContactRelations", "Id", crId);
  }
}

當然,根據您確切的數據庫結構,可能需要更改某些代碼。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因