2014-03-12 36 views
3

鉴于:在代码中添加关系只

  • 数据库模型不能触及(由供应商提供的数据库,我们会失去支持,如果我们改变数据)
  • 所有实体间的关系缺少

通常情况下,我们确实有ID,名称的用户表...和与ID,USER_ID,量... 交易表由于没有在数据库级别没有关系,实体框架不涉及在一起的对象,并没有办法使用constr如下所示:

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

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

+0

因此,如果没有定义关系,您的供应商如何确保参考完整性?触发器? – Marco

+0

我想他们在代码级别手动执行它 – Jaepetto

回答

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。

+0

从数据库中生成模型时,您如何实现这一目标?编辑自动生成的模型是否安全? – Jaepetto

+0

绝对是我的错,我先阅读代码!!! :我会留在这里作为参考。 – Oliver

+0

这就是我的想法。无论如何感谢您的时间。 – Jaepetto

0

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

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