鉴于:
通常,我们有一个带有id,name ...的用户表和一个id为user_id,amount的事务表... 由于在DB级别没有关系,Entity Framework不会将对象关联在一起,也无法使用如下构造:
transactions.Select(t=> new {t.id, t.user.name, t.amount})
有没有办法在Entity Framework中手动添加关系(模型优先),以便我们可以利用Linq?
答案 0 :(得分:1)
是的,这是可能的。
先建模
在edmx设计器中,右键单击>添加新>协会。您将获得一个对话框来设置两个模型之间的关系:
代码
类似于以下模型设置的东西应该可以工作,即使数据库上没有关系:
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()
方法,该方法调用构造函数,然后调用方法。然后你只需检查没有人直接调用构造函数,但只能通过你的创建者方法。