Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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 - Fatal编程技术网

C# 更新关系实体

C# 更新关系实体,c#,entity-framework,C#,Entity Framework,我有一个需要帮助的场景 让我们假设有一个用户在听某种类型的音乐 class User { public virtual List<UserMusicType> Music { get; set; } } public class UserMusicType { public int ID { get; set; } public MusicType name { get; set; } } public class MusicType { p

我有一个需要帮助的场景

让我们假设有一个用户在听某种类型的音乐

class User
{   
    public virtual List<UserMusicType> Music { get; set; }
}

public class UserMusicType
{
    public int ID { get; set; }
    public MusicType name { get; set; }
}

public class MusicType
{
    public int ID { get; set; }
    public string Name { get; set; }
}
有没有更好的方法来解决这个问题

我很高兴能收到EF有经验人士的回复。我想知道是否有一种有效的方法。或者即使我的方法/模型完全错误或者可以改进。

第一个问题:

实际上,这是个人的喜好。因为,不希望删除属于该用户的所有行,然后插入它们。我会将表单中发布的集合与数据库中存储的行进行比较。然后,从数据库中删除集合中不再存在的实体。然后,插入新的。甚至,您可以更新那些修改了一些附加细节的实体

顺便说一句,您可以先使用新发布的for Entity框架代码轻松实现这一点。我是这个产品的作者。我已经发表在了,和。借助于
InsertOrUpdateGraph
方法,它将自动将您的实体设置为
Added
Modified
。在
DeleteMissingEntities
方法的帮助下,您可以删除数据库中存在但不在当前集合中的实体

// This will set the state of the main entity and all of it's navigational 
// properties as `Added` or `Modified`.
context.InsertOrUpdateGraph(user)
       .After(entity =>
       {
            // And this will delete missing UserMusicType objects.
            entity.HasCollection(p => p.Music)
               .DeleteMissingEntities();
       });  
您可以通过一步一步的演示来阅读,并且可以下载一个示例项目

第二个问题:


我不知道您在哪个平台上开发应用程序。但是,通常情况下,我将
MusicType
等库存储在缓存中。并使用
DropDownList
元素渲染所有类型。当用户发布表单时,我得到的是值,而不是所选类型的名称。因此,不需要额外的工作。

首先,您不需要
UserMusicType
类,只需将`User类声明为

class User
{   
    public virtual List<MusicType> Music { get; set; }
}

你不应该依赖音乐名称

好吧,我不知道EF可以自动创建多对多表。如果我在复选框中使用MusicType.ID,任何用户都可以修改它并键入一些可能永远不存在的随机ID。EF是否只添加存在的内容?或者它会像以前一样添加一个新ID?我需要担心例外情况吗?只有非常熟悉HTML和一些黑客背景的用户才会这样做,您可以先检查数据库中是否存在ID,注意ID在UI中不可见,如果我在复选框中使用MusicType.ID,它的典型HTML将是
Music 1
,任何用户都可以修改它并键入一些可能永远不存在的随机id。EF是否只添加存在的内容?或者它会像以前一样添加一个新ID?我需要担心异常吗?@Waleed如果您将其状态更改为
Added
,它将插入新的异常。但是,通常更好的方法是检查提交的类型id是否已经存在于存储在缓存中的
MusicType
集合中。因此,不需要对数据库进行额外的查询。
class User
{   
    public virtual List<MusicType> Music { get; set; }
}
user.Music.Add(new MusicType{ID=[selected ID ]}