Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多对多关系实体框架创建新行_C#_Entity Framework_Asp.net Mvc 4_Entity Framework 5 - Fatal编程技术网

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