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 ]}