Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.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# EF中的多对多关系没有与实体的链接_C#_Entity Framework_Ef Fluent Api - Fatal编程技术网

C# EF中的多对多关系没有与实体的链接

C# EF中的多对多关系没有与实体的链接,c#,entity-framework,ef-fluent-api,C#,Entity Framework,Ef Fluent Api,我希望使用隐式连接表从多对多关系中的常见模式转变为多对多关系,相反,我希望显式地使用连接表并实现一种多对多依赖实体的延迟加载 这是由断开连接集的设计构成的,其中对象图通过http传递到应用程序服务器。在服务器上,我只更新密钥,而不更新实体。 原因是:如果我试图保存用实体模型的不同实例定义的相同实体,我会得到并发场景错误。 相反,我不想传递对象,我只想传递带有ID的关节表 Class ------- int ID List ClassStudent Student ------- int ID

我希望使用隐式连接表从多对多关系中的常见模式转变为多对多关系,相反,我希望显式地使用连接表并实现一种多对多依赖实体的延迟加载

这是由断开连接集的设计构成的,其中对象图通过http传递到应用程序服务器。在服务器上,我只更新密钥,而不更新实体。 原因是:如果我试图保存用实体模型的不同实例定义的相同实体,我会得到并发场景错误。 相反,我不想传递对象,我只想传递带有ID的关节表

Class
-------
int ID
List ClassStudent

Student
-------
int ID
List ClassStudent


ClassStudent // this type must be explicitely defined in the model
--------------
StudentID
ClassID
是否可以使用FluentApi定义此类配置

常见的场景是使用以下类型:

Student
---------------
int ID
List Classes

Class
----------
int ID
List Students
我不需要这个,因为同时发生了变化。
需要帮助使用fluentapi。我试过很多案例。

是的,有可能。您只需为
ClassStudent
和两个单向
一对多关系(
Student->ClassStudent
Class->ClassStudent
)配置一个复合主键

大概是这样的:

modelBuilder.Entity<ClassStudent>()
    .HasKey(e => new { e.StudentID, e.ClassID });

modelBuilder.Entity<Student>()
    .HasMany(e => e.ClassStudent)
    .WithRequired()
    .HasForeignKey(e => e.StudentID);

modelBuilder.Entity<Class>()
    .HasMany(e => e.ClassStudent)
    .WithRequired()
    .HasForeignKey(e => e.ClassID);
modelBuilder.Entity()
.HasKey(e=>new{e.StudentID,e.ClassID});
modelBuilder.Entity()
.HasMany(e=>e.ClassStudent)
.WithRequired()
.HasForeignKey(e=>e.StudentID);
modelBuilder.Entity()
.HasMany(e=>e.ClassStudent)
.WithRequired()
.HasForeignKey(e=>e.ClassID);

是的,这是可能的。您只需为
ClassStudent
和两个单向
一对多关系(
Student->ClassStudent
Class->ClassStudent
)配置一个复合主键

大概是这样的:

modelBuilder.Entity<ClassStudent>()
    .HasKey(e => new { e.StudentID, e.ClassID });

modelBuilder.Entity<Student>()
    .HasMany(e => e.ClassStudent)
    .WithRequired()
    .HasForeignKey(e => e.StudentID);

modelBuilder.Entity<Class>()
    .HasMany(e => e.ClassStudent)
    .WithRequired()
    .HasForeignKey(e => e.ClassID);
modelBuilder.Entity()
.HasKey(e=>new{e.StudentID,e.ClassID});
modelBuilder.Entity()
.HasMany(e=>e.ClassStudent)
.WithRequired()
.HasForeignKey(e=>e.StudentID);
modelBuilder.Entity()
.HasMany(e=>e.ClassStudent)
.WithRequired()
.HasForeignKey(e=>e.ClassID);

谢谢!它救了我。我让学生用外键上课。现在,当我得到IQueryable.include时,属性是空的。我应该单独加载班级学生表吗?或者有其他方法使用fluent api配置填充属性?欢迎使用。不过,我不太明白最后的评论/问题。没有什么比这更特别的了。执行类似
var classes=db.Class.Include(e=>e.ClassStudent.ToList()不加载
ClassStudent
属性。学生的情况类似。是的,只是我忘了给数据播种。没关系。谢谢!它救了我。我让学生用外键上课。现在,当我得到IQueryable.include时,属性是空的。我应该单独加载班级学生表吗?或者有其他方法使用fluent api配置填充属性?欢迎使用。不过,我不太明白最后的评论/问题。没有什么比这更特别的了。执行类似
var classes=db.Class.Include(e=>e.ClassStudent.ToList()不加载
ClassStudent
属性。类似于
Student
s。是的,只是我忘了给数据播种。没关系。