'无法插入值NULL'尝试清空集合时出现错误

时间:2017-02-26 20:27:17

标签: c# sql-server database entity-framework

我正在使用Entity Framework。类ChatRoom有一个TranscriptDownloadUserInfo类列表。现在当我尝试空时使用.Clear(),它显示我'无法插入值NULL';

ChatRoom.cs

    public class ChatRoom
    {
        [Key]
        public int Key { get; set; }

        public virtual ICollection<TranscriptDownloadUserInfo> TranscriptDownAllowedUsers { get; set; }

        public ChatRoom()
        {
            TranscriptDownAllowedUsers = new SafeCollection<TranscriptDownloadUserInfo>();
        }
    }

TranscriptDownloadUserInfo.cs

    public class TranscriptDownloadUserInfo
    {
        [Key]
        public int Key { get; set; }

        public virtual ChatUser User { get; set; }
        public int? UserKey { get; set; }

        public bool Allowed { get; set; }
    }

TranscriptDownloadUserInfo Mapping

    public TranscriptDownloadUserInfoMap()
    {
        this.HasKey(t => t.Key);

        this.ToTable("TranscriptDownAllowedUsers");
        this.Property(t => t.Key).HasColumnName("Key");
        this.Property(t => t.UserKey).HasColumnName("UserKey");
        this.Property(t => t.Allowed).HasColumnName("Allowed");

        this.HasRequired(t => t.User)
            .WithMany()
            .HasForeignKey(t => t.UserKey);
    }

添加迁移代码

    public override void Up()
    {
        CreateTable(
            "dbo.TranscriptDownAllowedUsers",
            c => new
            {
                Key = c.Int(nullable: false, identity: true),
                UserKey = c.Int(nullable: false),
                Allowed = c.Boolean(nullable: false, defaultValue: false),
                ChatRoom_Key = c.Int(nullable: false),
            })
            .PrimaryKey(t => t.Key)
            .ForeignKey("dbo.ChatUsers", t => t.UserKey, cascadeDelete: true)
            .ForeignKey("dbo.ChatRooms", t => t.ChatRoom_Key)
            .Index(t => t.UserKey)
            .Index(t => t.ChatRoom_Key);
    }

生成错误的代码

room.TranscriptDownAllowedUsers.Clear();
_repository.CommitChanges();

内异常

  

无法将值NULL插入列&#39; ChatRoom_Key&#39;,表中   &#39; Dabb.dbo.TranscriptDownAllowedUsers&#39 ;;列不允许空值。   UPDATE失败。\ r \ n语句已终止。

我不确定为什么会出现此错误。任何建议都将受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

我认为存在矛盾nullable: false, identity: true,因为您将密钥列定义为标识,因此EF 假设可以插入 null值以生成新密钥。

在这种情况下,你应该让它可以为空。

也就是说,must使您的外键ChatRoom_Key可以为空,因为Clear必须删除引用。

答案 1 :(得分:0)

您的字段不可为空。

            Key = c.Int(nullable: false, identity: true),
            UserKey = c.Int(nullable: false),
            Allowed = c.Boolean(nullable: false, defaultValue: false),
            ChatRoom_Key = c.Int(nullable: false),

您可以插入默认值或某些内容,但不能插入任何内容。