【问题标题】:Having problems with fluent api and relationships流利的 api 和关系有问题
【发布时间】:2012-11-23 12:12:47
【问题描述】:

我在实体框架 4.1 和关系方面遇到问题。

这是我的课程:

[Table("PROJTABLE")]
    public class Certifikat {
        [Key]
        public long Recid { get; set; }

        public String Projid { get; set; }           
        public virtual StandardAndScope StandardInfo { get; set; }
}

[Table("DS_CRT_PROJSTANDARDSCOPE")]
    public class StandardAndScope {
        //[Key]
        //public long RECID { get; set; }
        [Key]
        public String Projid { get; set; }

        public String Standard { get; set; }
        public String Scope { get; set; }
    }

由于我无法控制数据库,因此我无法更改键和 ID 以支持约定,因此我坚持使用此设置。

我的问题是,Certifikat 可以与一个 StandardAndScope 有关系。两个表中的键都称为 Projid - 但严格来说,这不是两个表的数据库中的主键。

我真正想说的是:“certifikat c join standardandscope s on c.Projid=s.Projid”

如何使用 fluent api 完成此任务?

【问题讨论】:

  • 两个实体是否都引用了Project 实体?
  • 戴德。我的问题非常相关。如果它们引用相同的项目实体,您可以使用这些导航属性。
  • 抱歉,没有注意到您的评论。实际上没有项目实体(如果我有机会我会杀死制作这个数据库的人)。但是我发现,如果不同的列具有特定值(“crt”),则只有一对多关系,但我不知道是否可以告诉实体框架仅映射设置此值的行
  • 好吧,糟糕的设计,叹息。您无法通过映射解决它,因为 Projid 应该是其中一个实体的标识符。如答案所示,您将不得不求助于临时加入。 (我祈祷你找不到数据库设计者)。

标签: c# entity-framework


【解决方案1】:

我认为您正在寻找这样的东西:

var result = dataContext.Certifikats
    .Join(dataContext.StandardAndScopes,
        c => c.Projid,
        s => s.Projid,
        (c, s) => new
        {
            Certifikat = c,
            StandardAndScope = s
        });

其中dataContext 是您的DbContext 类的一个实例。

【讨论】:

  • 嗯,这并不完全是利用 EF 导航属性的优势。我不应该在需要时依赖加入数据。
  • @Dynde,我没有看到您的类中定义了任何导航属性。
  • 真的吗?我认为虚拟 StandardAndScope StandardInfo 是一个导航属性。但是,我将不得不求助于这种类的连接,而不是使用导航属性。
  • 当与standardscope 存在一对多关系时,我将如何加入?某种 List = s - 但 s 是单数?
  • @Dynde,我不明白你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
相关资源
最近更新 更多