2010-05-24 209 views
0

我试图添加从实体数据模型类创建的对象。我有一个名为Users的表格,它已经变成了一个User EDM类。而且我还有一个Pages页面,它已经成为一个Page EDM类。这些表具有外键关系,因此每个页面都与许多用户关联。现在我想能够添加一个页面,但我无法得到如何去做。我在下面的用户处得到一个null参考异常。我仍然很困惑这一切,所以我敢肯定这是一个简单的错误,但我不知道该怎么做。实体框架中的外键关系

另外,顺便说一下,编译器要求我在对象初始值设定项中设置PageID,即使此字段在表中设置为自动ID。我是否正确地将它设置为0,期望它在保存时自动更新在表格中,或者我应该怎么做?

任何帮助表示赞赏!

问题的方法:

private Page GetPage(User currentUser) 
{ 
    string url = _request.ServerVariables["url"].ToLower(); 
    var userPages = from p in _context.PageSet 
        where p.Users.UserID == currentUser.UserID 
        select p; 
    var existingPage = userPages.FirstOrDefault(e => e.Url == url); 

    if (existingPage != null) 
     return existingPage; 

    Page page = new Page() 
        { 
         Count = 0, 
         Url = _request.ServerVariables["url"].ToLower(), 
         PageID = 0, //Only initial value, changed later? 
        }; 

    _context.AddToPageSet(page); 
    page.Users.UserID = currentUser.UserID; //Here's the problem... 
    return page; 
} 

回答

1

尝试:

page.Users = _context.Users.First(u => u.UserId == currentUser.UserID); 

关于这一点:

另外,顺便说一句,编译器需要我的对象设定PAGEID初始值设定程序

这不应该是真的。什么是确切的错误信息?另外,什么是ID的类型?

+0

谢谢,但不幸的是它不起作用...首先,您的表达式试图将一个User对象分配给一个int(UserID)。所以我改为page.Users.UserID = _context.UserSet.First(u => u.UserID == currentUser.UserID).UserID;但那也行不通。仍然在page.Users.UserID的用户部分nullreference。我试图添加一个新的页面行,然后将该新页面上的外键UserID设置为当前User对象的UserID(主键)。我在这里错过了什么吗?很明显,新页面的Users集合是空的,但是我需要做些什么来添加它呢? – Anders 2010-05-24 13:41:10

+0

对不起,复制/粘贴错误。固定。根据你上面的代码,'Users'看起来像一个'User',而不是一个集合。 – 2010-05-24 14:13:16

+0

你说得对,它不是一个集合。但为什么它会被称为用户然后...?但是,这工作!我进一步调查了一下,例如这里建议不要这样做:http://www.codewrecks.com/blog/index.php/2009/02/18/entity-framework-relations-and-entitykey/(显然是由于开销)。但是替代代码真的太复杂了,所以我宁愿随你的建议去。任何承担这一点? (我使用EF 3.5 btw,在这方面是4.0不同的?)。谢谢你的帮助! – Anders 2010-05-24 14:47:30