具有SQL Server CE数据库的实体框架:多对多关系提供异常“值不能为空。参数名称:源”

时间:2013-07-21 11:19:02

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

我在远程计算机上的SQL Server上创建了一个小型数据库,其中有几个表,称为DocumentFileTag。关系非常简单:文件 - >文档:一对多,标记 - >文档:多对多。所以我创建了一个名为document_tag的链接表,我在其中存储了文档并标记了Id's。

然后我要求Entity Framework为我创建相应的代码,这导致了几个类。一切都运行得很好,除了性能有点慢,所以我决定创建一个.SDF文件(SQL Server CE数据库),保留与模型对话的代码,让Entity Framework重新创建模型。

在此之后,我只需运行以下代码

var doc = new Document { Name = "Test", Documentdate = new DateTime( 2010, 1, 2 };
var file = new File{ Document = doc, Filename = "test.txt", Scandate = new DateTime( 2010, 1, 3 ) };
var tag1 = new Tag { Name = "test-tag" };

_db.documents.Add(doc);
_db.files.Add(file);
_db.tags.Add(tag1);

_db.SaveChanges();

一切正常,文档,文件和标签都会存储。

但是,当我只添加行以将标记分配给文档时:

var doc = new Document { Name = "Test", Documentdate = new DateTime( 2010, 1, 2 };
var file = new File{ Document = doc, Filename = "test.txt", Scandate = new DateTime( 2010, 1, 3 ) };
var tag1 = new Tag { Name = "test-tag" };
_db.documents.Add(doc);
tag1.Documents.Add(doc);
_db.files.Add(file);
_db.tags.Add(tag1);
_db.SaveChanges();

我得到了例外

  

值不能为空。参数名称:source

<{1>}来电{p>。有谁知道我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

确定。事实证明,我需要在documents_tag表中指定文档和标记ID作为主键。错误发送错误的方式,但当我尝试在空解决方案中重新创建方案时,从数据库生成代码时出现此错误:

The table/view 'document_tag' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.

这是该解决方案的线索。希望它可以帮助其他人。您需要在修改数据库后重新创建模型。也许刷新就足够了,我重新创造了一切。