C# 多对多关系实体框架创建新行
我正在构建一个反馈功能。反馈应该有多个类别,并且应该可以根据类别找到反馈,因此存在多对多关系 我已经为此设置了以下代码,它首先被设计为代码 回馈项目:C# 多对多关系实体框架创建新行,c#,entity-framework,asp.net-mvc-4,entity-framework-5,C#,Entity Framework,Asp.net Mvc 4,Entity Framework 5,我正在构建一个反馈功能。反馈应该有多个类别,并且应该可以根据类别找到反馈,因此存在多对多关系 我已经为此设置了以下代码,它首先被设计为代码 回馈项目: public class FeedbackItem { public FeedbackItem() { } [Key] public long Id { get; set; } public virtual ICollection<FeedbackCategory> Category
public class FeedbackItem
{
public FeedbackItem()
{
}
[Key]
public long Id { get; set; }
public virtual ICollection<FeedbackCategory> Categorys { get; set; }
//public
public string Content { get; set; }
public bool Notify { get; set; }
public string SubscriptionUserName { get; set; }
public string SubscriptionUserEmail { get; set; }
public long SubscriptionId { get; set; }
}
这将转换为反馈项
,并由以下代码处理
public class FeedbackSqlRepository : IFeedbackSqlRepository
{
public int Create(FeedbackItem feedback)
{
if (feedback == null)
{
throw new ArgumentNullException("feedback", "FeedbackItem cannot be empty.");
}
using (var context = new FeedbackContext())
{
context.FeedbackItems.Add(feedback);
return context.SaveChanges();
}
}
}
这里发生的事情是EF创建了一个新的FeedbackItem
,一个新的FeedbackCategory
将创建的反馈项映射到FeedbackCategoryFeedbackItems
表中新创建的反馈类别
这不是我想要的工作
我希望:
{
"categorys": [
{
"$id": "1",
"Feedbacks": [],
"Id": 1,
"Value": "Android"
}
],
"subscriptionUserName": "name",
"subscriptionUserEmail": "my@email.com",
"content": "this is a feedback item",
"notify": false,
"subscriptionId": 2
}
在FeedbackCategoryFeedbackItems
表中创建新的FeedbackItem
并尊重现有的FeedbackCategory
。我对EF的了解太少,无法理解这里出了什么问题,以及如何让首选工作正常进行
========
修复了来自反馈QLRepository
的Create方法中的以下代码的问题:
foreach (FeedbackCategory feedbackCategory in feedback.Categories)
{
context.Entry(feedbackCategory).State = EntityState.Unchanged;
}
context.FeedbackItems.Add(feedback);
return context.SaveChanges();
实体框架不会检查实体内容并为您确定它们是新的还是添加的 Add()使对象图中的所有实体标记为已添加,并在调用SaveChanges()时生成插入 Attach()将所有实体标记为未修改 如果有些实体是新的,有些是修改的,有些只是引用,那么您应该使用Add()或Attach(),然后在调用SaveChanges()之前在必要时手动设置实体状态
您的问题可能来自使用不同的上下文对象来获取
FeedbackCategory
,然后使用另一个对象来保存它们。试试这个,你能给我们展示一下你在FeedbackCategory、FeedbackItem和FeedbackCategoryFeedbackItems之间的映射吗?是否将一个实体映射到一个表?EF无法跨断开连接的上下文跟踪(子)实体。您需要自己处理跟踪,即在服务器上检查子实体是否已经存在,并将其标记为EntityState。在调用“SaveChanges”之前未修改。谢谢!这很有效。用以下代码修复了它:foreach(FeedbackCategory FeedbackCategory in feedback.Categories){context.Entry(FeedbackCategory.State=EntityState.Unchanged;}context.FeedbackItems.Add(feedback);返回context.SaveChanges()代码>或者,您可以使用Attach()方法而不是Add(),只需设置要添加的单个实体的状态。可能不会有性能上的差异,但您的代码会更清晰一些。
{
"categorys": [
{
"$id": "1",
"Feedbacks": [],
"Id": 1,
"Value": "Android"
}
],
"subscriptionUserName": "name",
"subscriptionUserEmail": "my@email.com",
"content": "this is a feedback item",
"notify": false,
"subscriptionId": 2
}
public class FeedbackSqlRepository : IFeedbackSqlRepository
{
public int Create(FeedbackItem feedback)
{
if (feedback == null)
{
throw new ArgumentNullException("feedback", "FeedbackItem cannot be empty.");
}
using (var context = new FeedbackContext())
{
context.FeedbackItems.Add(feedback);
return context.SaveChanges();
}
}
}
foreach (FeedbackCategory feedbackCategory in feedback.Categories)
{
context.Entry(feedbackCategory).State = EntityState.Unchanged;
}
context.FeedbackItems.Add(feedback);
return context.SaveChanges();
DbContext.Entry(entity).State = EntityState.Unmodified