EF - 对于已创建的实体:无法将值 NULL 插入“Id”列、“Languages”表;列不允许空值

Posted

技术标签:

【中文标题】EF - 对于已创建的实体:无法将值 NULL 插入“Id”列、“Languages”表;列不允许空值【英文标题】:EF - For an already created entity: Cannot insert the value NULL into column 'Id', table 'Languages'; column does not allow nulls 【发布时间】:2016-08-29 17:38:13 【问题描述】:

我在尝试插入新项目但将其与已创建的(语言)记录链接时收到该错误:

  var languageRepository = RepositoryFactory.CreateReadOnly<Language>();
  _defaultLanguage = languageRepository.FirstOrDefault(l => l.IsDefault);

  (...)

 newItem.Images = new List<Image>
                
                    new Image
                    
                          FileName = filename,
                          Language = _defaultLanguage
                    
                ;

在这种情况下_defaultLanguage 已经存在于数据库中,那么我不知道为什么它试图将其作为新记录插入,而不是仅仅链接到已经存在的 Id。

_defaultLanguage的内容:

有什么想法可以帮上忙吗?

【问题讨论】:

Language 是什么类型,请发布 Images 密钥以及 Item 密钥。 您必须添加更多代码才能获得帮助。 @AlbertoMontellano,当您将CreateReadOnly 更改为正常提取时,问题是否仍然存在? 如果 newItem 是您编写的用于保存新项目的类的对象,那么我们需要查看该代码。如果您只是使用 newItem.Save(),那么我们需要在您已经向我们展示的代码的上下文中查看该代码。有关如何正确执行此操作的更多信息,请参见此处:***.com/help/mcve @OrelEraki 希望你能把你的答案放在这里吗?将来会帮助其他人。 【参考方案1】:

CreateReadOnly 看起来很可疑。

尝试将以下内容更改为正常提取。

var languageRepository = RepositoryFactory.CreateReadOnly<Language>();

我相信Detach(Untracked)提取的条目。

【讨论】:

什么是“正常提取”? 我猜不出他是怎么做到的RepositoryFactory我猜这有点像.GetRepositoryInstance&lt;Language&gt;() 那么你为什么要回答一个不清楚的问题呢?但是如何定义“正常提取”? @GertArnold 这是来自 OP 的反馈:@OrelEraki you're right! I changed that to normal extraction and it worked.。希望他解决了这个问题。因此我认为这个提示适合作为答案。 不,不是。它对未来的读者一点用处都没有。你自己创造了这个词,所以我猜你一定知道你在说什么。

以上是关于EF - 对于已创建的实体:无法将值 NULL 插入“Id”列、“Languages”表;列不允许空值的主要内容,如果未能解决你的问题,请参考以下文章

无法将值 NULL 插入列“TaskID”、表“TEAM.dbo.Task”;列不允许空语句已终止[重复]

尽管提供了值,但实体框架仍插入 null

在EF4中无法在不首先获取实体的情况下更新实体

EF6 无法将分离的实体附加到上下文

Entity Framework 6 GUID 作为主键:无法将值 NULL 插入列“Id”、表“FileStore”;列不允许空值

EF 尝试插入未更改的实体