C# 仅在代码中添加关系
鉴于:C# 仅在代码中添加关系,c#,linq,entity-framework,C#,Linq,Entity Framework,鉴于: 数据库模型无法触摸(数据库由供应商提供;如果更改数据,我们将失去支持) 缺少实体之间的所有关系 通常,我们有一个id为、名称为。。。和一个带有id、用户id、金额的事务表。。。 由于数据库级别没有关系,Entity Framework不会将对象关联在一起,也无法使用以下结构: transactions.Select(t=> new {t.id, t.user.name, t.amount}) 是否有办法在实体框架中手动添加关系(模型优先),以便我们可以利用Linq?是的,这是
- 数据库模型无法触摸(数据库由供应商提供;如果更改数据,我们将失去支持)
- 缺少实体之间的所有关系
transactions.Select(t=> new {t.id, t.user.name, t.amount})
是否有办法在实体框架中手动添加关系(模型优先),以便我们可以利用Linq?是的,这是可能的
型号优先
在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; }
}
然后应该是可能的,并且在运行时EF会很好地将其转换为SQL。通常,使用实体框架生成的所有类都是
部分的
。这意味着您可以向项目中添加第二个.cs文件,在该文件中可以添加相同的类(在相同的命名空间中)并向其中添加您自己的方法。在那里,您可以添加自己的AddRelationsToDataSet()
方法,如果您在模型上通过设计器进行任何更改,则不会触及该方法
唯一的缺点是,您必须在构造函数之后的每个位置手动调用此方法。或者在分部类部分中创建一个静态
create()
方法,该方法调用构造函数,然后调用方法。然后,您只需检查是否没有人直接调用构造函数,而只能通过您的创建者方法进行调用。那么,如果没有定义关系,您的供应商如何确保引用完整性?触发器?我想它们是在代码级别手动执行的。当从数据库生成模型时,如何实现这一点?编辑自动生成的模型安全吗?绝对是我的错,我先看代码!!!:我把这个放在这里作为参考,我就是这么想的。无论如何,谢谢您的时间。我很确定您可以在edmx设计器中完成此操作,右键单击>添加新>关联。你会得到一个对话来建立关系。你的回答绝对有帮助。很抱歉很长时间没有回复你。
transactions.Select(t=> new {t.id, t.user.name, t.amount});