【问题标题】:EF code first automatic foreign key association problemEF代码第一次自动外键关联问题
【发布时间】:2011-01-26 11:11:51
【问题描述】:

我首先通过本教程对最新版本的 EF 代码有了基本的了解 - http://www.asp.net/mvc/tutorials/getting-started-with-mvc3-part4-cs 但我对某个方面有点困惑,想知道是否有人可以阐明它?解释一下 - 有一个名为“Site”的类,我想要一个名为“HomePageId”的字段,然后应该映射到具有该 ID 的“SitePage”对象。看起来很简单?但是,当 EF 创建 Db 和关系时,它似乎并不理解这一点。我确定这是我做错了 - 这是代码:

public class Site
{
    public int SiteId { get; set; }
    public string SiteName { get; set; }
    public string SiteUrlPortion { get; set; }

    // Relationship - SitePages
    public virtual ICollection<SitePage> SitePages { get; set; }

    // Relationship - HomePage
    public int HomePageId { get; set; }
    public virtual SitePage HomePage { get; set; }
}

public class SitePage
{
    public int SitePageId { get; set; }
    public string SitePageTitle { get; set; }
    public string SitePageUrlPortion { get; set; }

    // Relationship - Site
    public int SiteId { get; set; }
    public virtual Site Site { get; set; }       
}

“SitePage”类生成与“Site”的关系,如您所料。但是我在两个表中的列方面不仅没有意义,而且代码方面的关系也没有按预期工作。 (例如,当我给“Site”一个“HomePageId”时,该站点的“HomePage”为空。

显然,在文档方面几乎没有,因为它仍在开发中,但只是想知道是否有人有任何想法?我需要开始用属性装饰属性吗?还是我要求它理解一些它永远不会理解的东西?!

在此先感谢大家。无论如何,我会坚持下去,并将我发现的任何东西发回。 抢

【问题讨论】:

    标签: c# asp.net-mvc ef-code-first


    【解决方案1】:

    尝试使用这样的 ForeignKey 属性标记您的 HomePage 属性

    [Foreignkey("HomePageId")]
    public virtual SitePage HomePage { get; set; }
    

    你也可以使用流利的配置,但不要记住那个副手

    【讨论】:

    • 嗨,汤姆 - 感谢您的建议。我确实尝试过,但结果相同。现在已经坚持使用解决方法 - 两个非关键列“主页 id”和“主页 url” - 这并不理想,但因为它们是我真正需要使用的仅有的两条数据,它不是火车粉碎不是那里有完整的“主页”对象..
    【解决方案2】:

    这可能是 EF 的限制。那个 EF 只能处理 2 个表之间的一种关系。

    表之间有 2 种关系,即与网站页面列表和主页之间的关系。

    尝试删除此行:

    public virtual SitePage HomePage { get; set; } 
    

    你还有 homepageid,所以在某种程度上这个信息是多余的。

    【讨论】:

    • 您好,感谢您的回答。我知道你在说什么,但是我必须在某处做一个进一步的查询,比如“sitePages.Single(p=>p.SitePageid == this.HomePageId)”——也许是在 HomePage 实体类本身这让我感到不安——不过我会试试的!
    • 实际上这会引发错误 - “已经有一个打开的 DataReader 与此命令关联,必须先关闭。”。答案可能是建立一个名为“主页”的单独实体。我现在就试试这个。
    • 还要检查 MultipleActiveResultSets 设置为 true 的连接字符串。
    猜你喜欢
    • 2016-01-31
    • 2022-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2018-02-13
    相关资源
    最近更新 更多