【问题标题】:Foreign key relationships in Entity Framework实体框架中的外键关系
【发布时间】:2010-05-24 22:03:38
【问题描述】:

我正在尝试添加从实体数据模型类创建的对象。我有一个名为 Users 的表,它已经变成了一个 User EDM 类。而且我还有一个表格Pages,已经变成了Page EDM类。这些表具有外键关系,因此每个页面都与许多用户相关联。现在我希望能够添加一个页面,但我不知道该怎么做。我在下面的用户上得到一个空引用异常。我仍然对这一切感到困惑,所以我确定这是一个简单的错误,但我就是不知道该怎么做。

另外,顺便说一下,编译器要求我在对象初始化器中设置 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;
}

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    试试:

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

    关于这个:

    另外,顺便说一句,编译器要求我在对象初始化器中设置 PageID

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

    【讨论】:

    • 谢谢,但不幸的是它不起作用...首先,您的表达式尝试将用户对象分配给一个 int (UserID)。所以我改为 page.Users.UserID = _context.UserSet.First(u => u.UserID == currentUser.UserID).UserID;但这也行不通。 page.Users.UserID 的用户部分仍然为空引用。我正在尝试添加一个新的页面行,然后将该新页面上的外键 UserID 设置为当前的用户对象 UserID(主键)。我在这里错过了什么吗?显然新页面的Users集合是空的,那我需要怎么添加呢?
    • 对不起;复制/粘贴错误。固定的。根据您上面的代码,Users 看起来像一个 User,而不是一个集合。
    • 你说得对,这不是收藏。但是为什么它会被称为用户呢......?但这有效!不过,我进行了进一步调查,例如这里建议不要这样做:codewrecks.com/blog/index.php/2009/02/18/…(显然是由于开销)。但是替代代码确实过于复杂,所以我宁愿接受你的建议。对此有何看法? (顺便说一句,我使用的是 EF 3.5,4.0 在这方面有什么不同吗?)。感谢您的帮助!
    • 关于用户属性,显然它是一个“导航属性”,在实体模型设计器中查找。他们有点混乱......除了我上面的问题,我的用户 EDM 类还有 3 个导航属性 - “页面”、“用户 1”和“用户 2”,而页面 EDM 类只有一个“用户”导航财产。这些是怎么回事?
    • 之所以称为Users,是因为 EF 1 不会自动(去)复数化。 EF 4 可以。关于Users1等,看EF desinger中的映射细节;它应该告诉你它们代表什么。
    猜你喜欢
    • 2017-07-20
    • 2020-07-08
    • 1970-01-01
    • 2018-07-04
    • 2018-09-09
    • 2018-10-25
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多