开发者社区 问答 正文

首先将数据插入到由3个表创建的映射表中

我是C#的学生开发人员。我对使用方法插入数据有疑问。与普通的向一个表插入方法不同,当我尝试向映射表中插入数据时遇到错误。我们如何像这样添加到表中?您有什么建议吗?休闲表是此问题的一个示例。

namespace ImdbEntity.Models
{
    [Table("MovieCastRoleMappings")]
    public class MovieCastRoleMapping
    {
        [Key, Column(Order = 0)]
        public int fkCastId { get; set; }
        [ForeignKey("fkCastId")]
        public Cast Cast { get; set; }

        [Key, Column(Order = 1)]
        public int fkCastRoleId { get; set; }
        [ForeignKey("fkCastRoleId")]
        public CastRole CastRole { get; set; }

        [Key, Column(Order = 2)]
        public int fkMovieId { get; set; }
        [ForeignKey("fkMovieId")]
        public Movie Movie { get; set; }
    }
}

EF中的样本方法:

MovieCastRoleMapping mcrm = new MovieCastRoleMapping();
                mcrm.fkCastId = 1;
                mcrm.fkCastRoleId = 2;
                mcrm.fkMovieId = 3;
                db.MovieCastRoleMapping.Add(mcrm);
                db.SaveChanges();

我的错误:

'属性'fkCastId'是对象键信息的一部分,不能修改。'

展开
收起
几许相思几点泪 2019-12-10 19:37:15 826 分享 版权
阿里云 AI 助理回答

在Entity Framework中,当你定义一个类的属性为复合主键的一部分(如你所展示的MovieCastRoleMapping类),这些属性将被视为只读,因为EF会期望它们在插入时通过构造函数或初始化设置好值,并且之后不再改变。错误信息表明你尝试修改了作为键一部分的属性fkCastId

基于你的场景,确保你在创建MovieCastRoleMapping实例时直接通过构造函数或者初始化语句块设置所有键属性的值,而不是先创建对象再修改键属性。你的代码示例已经是正确的做法,但似乎你在其他地方可能误操作了键属性。以下是正确的插入数据方式:

// 确保在创建对象时直接初始化所有Key属性
MovieCastRoleMapping mcrm = new MovieCastRoleMapping
{
    fkCastId = 1,
    fkCastRoleId = 2,
    fkMovieId = 3
};

db.MovieCastRoleMapping.Add(mcrm);
db.SaveChanges();

如果你遇到问题的地方是在尝试更新这样的实体,请注意,对于复合主键的实体,你应该通过查询数据库获取到该实体的实例,然后修改非键属性,最后保存更改。直接创建新实例并试图修改其键属性是不被允许的,因为这等同于试图改变主键,而主键通常用于唯一标识数据库中的记录,不应该被变更。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: