仅在代码中添加关系

时间:2014-03-12 09:19:27

标签: c# linq entity-framework

鉴于:

  • 无法触及数据库模型(供应商提供的数据库;如果我们更改数据,我们会失去支持)
  • 实体之间的所有关系都缺失

通常,我们有一个带有id,name ...的用户表和一个id为user_id,amount的事务表... 由于在DB级别没有关系,Entity Framework不会将对象关联在一起,也无法使用如下构造:

transactions.Select(t=> new {t.id, t.user.name, t.amount})

有没有办法在Entity Framework中手动添加关系(模型优先),以便我们可以利用Linq?

2 个答案:

答案 0 :(得分:1)

是的,这是可能的。

先建模

在edmx设计器中,右键单击>添加新>协会。您将获得一个对话框来设置两个模型之间的关系:

enter image description here

代码

类似于以下模型设置的东西应该可以工作,即使数据库上没有关系:

public class User
{
    public int UserId { get; set; }

    [ForeignKey("UserId")]
    public virtual ICollection<Transaction> Transactions { get; set; }
}

public class Transaction
{
    public int TransactionId { get; set; }

    [ForeignKey("User")]
    public int UserId { get; set; }

    public User User { get; set; }
}

以这种方式设置模型时,请使用以下LINQ:

transactions.Select(t=> new {t.id, t.user.name, t.amount});

应该可以,并且在运行时将由EF很好地转换为SQL。

答案 1 :(得分:0)

通常,使用实体框架生成的所有类都是partial。这意味着您可以向项目添加第二个.cs文件,您可以在其中添加相同的类(在同一名称空间中)并向其添加自己的方法。在那里,您可以添加自己的AddRelationsToDataSet()方法,如果您通过模型上的设计师进行任何更改,则不会触及该方法。

唯一的缺点是,必须在构造函数之后的每个地方手动调用此方法。或者,在部分类部件中创建一个静态Create()方法,该方法调用构造函数,然后调用方法。然后你只需检查没有人直接调用构造函数,但只能通过你的创建者方法。