簡體   English   中英

實體框架,Pk,Fk,有時會出錯

[英]Entity Framework, Pk, Fk, sometimes getting error

當我想插入一些東西時,我偶爾會得到這個錯誤:

INSERT語句與FOREIGN KEY約束“FK_dbo.Climb_dbo.DifficultGrade_DifficultGradeID”沖突。 沖突發生在數據庫“ContosoUniversity2”,表“dbo.DifficultGrade”,列“DifficultGradeID”中。

該語句已終止。

但有時,我得到這個錯誤,有時我不會得到這個錯誤

我有這個插入:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ClimbViewModel ModelViewClimb)
{
    try
    {
        if (ModelState.IsValid)
        {
            var climb = new Climb();
            UpdateCLimb(climb, ModelViewClimb);
            db.Climbs.Add(climb);

            db.SaveChanges();
            return RedirectToAction("Index");
        }
    }
    catch (RetryLimitExceededException /* dex */)
    {
        ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
    }

    ViewBag.Id = new SelectList(db.countries, "Id", "country_name", ModelViewClimb.Id);
    ViewBag.DifficultGradeID = new SelectList(db.DifficultGrades, "DifficultGradeID", "NameDifficult", ModelViewClimb.Id);
    return View(new ClimbViewModel() );
}

這些是我的模特:

public class Climb
{
    // public Climb climb { get; set; }

    [Key]
    public int climbID { get; set; }
    //[Display(Name="difficulty")]
    public string Name { get; set; }

    public int? UserProfileID { get; set; }
    public int? CountryID { get; set; }
    public int? DifficultGradeID { get; set; }

    public virtual UserProfile userProfile { get; set; }
    public virtual Country country { get; set; }
    public virtual DifficultGrade difficult { get; set; }
}

public class DifficultGrade
{
    [Key]
    public int DifficultGradeID { get; set; }
    [Display(Name = "difficulty")]
    public string NameDifficult { get; set; }
    public virtual ICollection<Climb> Climbs { get; set; }
    public virtual ICollection<Route> Routes { get; set; }
}

我還告訴我們要做什么,用戶只需命名一個攀爬並選擇一個國家和一個困難的級別(簡單,正常,硬)所以兩個下拉列表和一個文本框字段。 通過添加新的爬升,我看到有時climbId和DifficultGradeID具有相同的id。

對於這樣的問題,請始終發布您正在使用的任何自定義方法的模型和代碼,即UpdateClimb 沒有這些信息,幾乎不可能給你任何好的指導。

但是,在這種情況下,我可以根據錯誤對您的問題進行假設。 最有可能的是, UpdateClimbClimb了一個帶有列表的多對多導航屬性。 例如:

climb.SomeM2MNavigationProperty = someEnumerable;

如果關系中已存在該枚舉中的任何項目,則會在更換整個列表時收到此錯誤,實體框架會將每個項目視為新添加的關系。 當它插入這個新的重復記錄時,數據庫會尖叫。

在這種情況下你應該做的是從現有關系中有選擇地添加和刪除項目。

// Remove items that are no longer related
entity.SomeM2MNavigationProperty.Where(m => !newRelationshipItemIds.Contains(m.Id))
    .ToList().ForEach(m => entity.SomeM2MNavigationProperty.Remove(m));

// Then you need to add any new relationships
var existingRelationshipItemIds = entity.SomeM2MNavigationProperty.Select(m => m.Id).ToList();
db.EntityDbSet.Where(m => newRelationshipItemIds.Except(existingRelationshipItemIds).Contains(m.Id))
    .ToList().ForEach(m => entity.SomeM2MNavigationProperty.Add(m));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM