Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅在代码中添加关系_C#_Linq_Entity Framework - Fatal编程技术网

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?是的,这是

鉴于:

  • 数据库模型无法触摸(数据库由供应商提供;如果更改数据,我们将失去支持)
  • 缺少实体之间的所有关系
通常,我们有一个id为、名称为。。。和一个带有id、用户id、金额的事务表。。。 由于数据库级别没有关系,Entity Framework不会将对象关联在一起,也无法使用以下结构:

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});