請跳過此閱讀編輯:)微風添加項目多對多我需要刷新頁面添加新項
當我有許多用於許多映射其他兩個實體的實體:
public class ExerciseAndCategory
{
#region Navigational properties
public int CategoryId { get; set; }
public virtual ExerciseCategory ExerciseCategory { get; set; }
public int ExerciseId { get; set; }
public virtual Exercise Exercise { get; set; }
#endregion
}
這裏是FluentApi它:
modelBuilder.Entity<ExerciseAndCategory>().HasKey(e => new {e.ExerciseId, e.CategoryId});
modelBuilder.Entity<ExerciseAndCategory>()
.HasRequired(e => e.Exercise)
.WithMany()
.HasForeignKey(e => e.ExerciseId)
.WillCascadeOnDelete(true);
modelBuilder.Entity<ExerciseAndCategory>()
.HasRequired(e => e.ExerciseCategory)
.WithMany()
.HasForeignKey(e => e.CategoryId)
.WillCascadeOnDelete(true);
而且在數據庫中,看起來像這樣:
要獲得並保存我使用BreezeApi控制器的數據,因爲它表明微風樣品中我添加數據:
[HttpPost]
public SaveResult SaveChanges(JObject saveBundle)
{
return _contextProvider.SaveChanges(saveBundle);
}
並在服務(使用微風)我送數據API這樣的:
addExerciseAndCategories: function (data, initialValues) {
var addedExercise = manager.createEntity("Exercise", initialValues);
_.forEach(data, function (item) {
var entity = manager.createEntity("ExerciseAndCategory", { ExerciseId: addedExercise._backingStore.ExerciseId, CategoryId: item.CategoryId });
items.push(entity);
});
saveChanges().fail(addFailed);
function addFailed() {
removeItem(items, item);
}
},
有了這個,我可以添加項目到數據庫,但如果我想補充而另一個沒有令人耳目一新,
我在這部分代碼得到異常:
[HttpPost]
public SaveResult SaveChanges(JObject saveBundle)
{
return _contextProvider.SaveChanges(saveBundle);
}
說
DBUpdateException was unhandeled by user code
An error occurred while updating the entries. See the inner exception for details.
而在JavaScript控制檯:
"Error: Error: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.ExerciseAndCategories_dbo.Exercises_ExerciseId". The conflict occurred in database "aspnet-Web.UserInterface.Web-20130806182934", table "dbo.Exercises", column 'ExerciseId'.
The statement has been terminated."
但是,如果我加入後刷新,一切工作正常。對於問題(即我可以添加另一個項目)
編輯
我發現非常糟糕的解決辦法。問題在於,在調用saveChanges()之前,ExerciseId是-1。我決定在兩種不同的功能中分別添加練習和類別。和我的代碼看起來是這樣的:
addExercise: function (initialValues) {
exerciseToAdd = manager.createEntity("Exercise", initialValues);
saveChanges().fail(addFailed);
function addFailed() {
removeItem(items, item);
}
},
addExerciseAndCategories:功能(數據){ newItems = [];
logger.log("id is", exerciseToAdd.ExerciseId);
_.forEach(data, function(item) {
var entity = manager.createEntity("ExerciseAndCategory", { ExerciseId: exerciseToAdd.ExerciseId, CategoryId: item.CategoryId });
items.push(entity);
newItems.push(entity);
});
saveChanges().fail(addFailed);
var itemsToAdd = addCategoriesToExercise(newItems);
_.forEach(itemsToAdd, function(item) {
exerciseAndCategories.push(item);
});
}
而這並沒有工作,同樣的錯誤。所以在控制檯中,我發現ExerciseId仍然是-1,然後我決定使用angular的$ timeout並等待幾秒鐘,然後記錄ExerciseId,之後ExerciseId的int大於-1,即它運行正常,所以我已經改變了代碼,這(和一切正常,因爲它應該):
addExerciseAndCategories: function(data) {
newItems = [];
$timeout(function() {
logger.log("id je", exerciseToAdd.ExerciseId);
_.forEach(data, function (item) {
var entity = manager.createEntity("ExerciseAndCategory", { ExerciseId: exerciseToAdd.ExerciseId, CategoryId: item.CategoryId });
items.push(entity);
newItems.push(entity);
});
saveChanges().fail(addFailed);
var itemsToAdd = addCategoriesToExercise(newItems);
_.forEach(itemsToAdd, function(item) {
exerciseAndCategories.push(item);
});
},5000);
function addFailed() {
removeItem(items, item);
}
},
最後,因爲我知道這是很糟糕的解決方案,我的問題是,我怎麼能解決這個得到什麼?有什麼方法可以讓我知道Exercise已插入數據庫,並且ExerciseId不再是-1了嗎?或者我可以在客戶端生成ExerciseId(int)嗎?
謝謝,爲了答案,但不是我在做什麼?我在Exercise和Category中間暴露了實體ExerciseAndCategory,或者我做錯了? – hyperN
如果你知道,請你能看到我的編輯和幫助嗎? – hyperN
@JayTraband你能給我們一個如何使用這個工作的例子嗎? –