Entity framework 实体框架将一对多映射到一个中间表,而该表没有类
我有Entity framework 实体框架将一对多映射到一个中间表,而该表没有类,entity-framework,entity-framework-mapping,Entity Framework,Entity Framework Mapping,我有 问题 { //身份证等 公共列表文件{get;set;} } 由于CloudFile可以被其他类使用,最干净的解决方案似乎是创建一个名为IssueFile的中间表。问题是我在代码中没有使用这样的类。。。那么,我如何在Issue和CloudFile之间映射,而不创建这样的中间类呢。或者这可能吗?我知道也有类似的问题(),但它们创建了这个中间类,但希望是不必要的类。唯一无法从中间表中获得信息的是多对多映射。在您的情况下,您要处理的是多对可选或多对必需。现在您有两个选择: 1) 外键关联:为此
问题
{
//身份证等
公共列表文件{get;set;}
}
由于
CloudFile
可以被其他类使用,最干净的解决方案似乎是创建一个名为IssueFile
的中间表。问题是我在代码中没有使用这样的类。。。那么,我如何在Issue
和CloudFile
之间映射,而不创建这样的中间类呢。或者这可能吗?我知道也有类似的问题(),但它们创建了这个中间类,但希望是不必要的类。唯一无法从中间表中获得信息的是多对多映射。在您的情况下,您要处理的是多对可选或多对必需。现在您有两个选择:
1) 外键关联:为此,您需要在CloudFile
类中定义外键。这有一些优点,因为您可以通过更改外键值来更新关系,并且可以通过使用伪外键值来添加新实体,而不需要依赖实体。总的来说,它只是更容易使用
Issue
{
//Id, etc
public List<CloudFile> Files { get; set; }
}
modelBuilder.Entity()
.HasMany(i=>i.CloudFile)
.WithRequired(i=>i.Issue)
.HasForeignKey(i=>i.Id);
2) 独立关联:模型上没有外键(当然它在内部使用该键),并且该关系有自己的状态跟踪
modelBuilder.Entity<Issue>()
.HasMany(i => i.CloudFile)
.WithRequired(i => i.Issue)
.HasForeignKey(i => i.Id);
modelBuilder.Entity()
.HasMany(i=>i.CloudFile)
.WithRequired(i=>i.Issue)
.Map(i=>i.MapKey(“Id”);
您需要的是每类型表(TPT)继承CloudFile
将是您的基类,派生类型将表示与所属实体的关系(Issue
,Order
,等等):
为什么您认为1:N关系需要连接表?你的设计似乎有缺陷;也许您应该发布这些可以引用
CloudFile
s的“其他类”的示例,例如User
可以拥有CloudFile
s,一个Order
可以拥有CloudFile
s,我不希望CloudFile
表拥有3个外键,其中2个总是null
我觉得更干净的方法是为每一个设置一个中间表。问题是CloudFile
表将获得一个Issue\u Id
或任何外键。正如我所说,CloudFile
将被问题以外的其他事物使用。这意味着我的CloudFile
表最终会有多个外键指向所有其他表。我不想那样。我想要一个将CloudFile
映射到Issue
的中间表,名为IssueFile
。我的问题是,如何在EF
中映射此设置,而不需要创建一个IssueFile
类,我的代码中永远不需要这个类。我知道我需要这个表,但是我怎样才能避免需要这个类呢?为什么外键需要一个额外的表而不是一个额外的列呢?有了独立的关联,EF会在后台处理外键,这样您就不必处理它,甚至不会出现在您的模型中。一旦你有了一个连接表,你就要处理多对多的问题,没有办法解决。因为这让我的表很难看。它迫使我在大多数列中有许多空值。。。这只是一种糟糕的做事方式。我没有意识到多对多是不可能的。。。不是,这正是我需要的。谢谢
modelBuilder.Entity<Issue>()
.HasMany(i => i.CloudFile)
.WithRequired(i => i.Issue)
.Map(i => i.MapKey("Id"));
[Table( "CloudFile" )]
public class CloudFile
{
public int Id { get; set; }
}
[Table( "IssueCloudFile" )]
public class IssueCloudFile : CloudFile
{
}
public class Issue
{
public int Id { get; set; }
public List<IssueCloudFile> Files { get; set; }
}
modelBulider.Entity<CloudFile>().ToTable( "CloudFile" );
modelBuilder.Entity<IssueCloudFile>().ToTable( "IssueCloudFile" );
var issueCloudFiles = db.CloudFiles.OfType<IssueCloudFile>();
// or through the referencing entities themselves
issueCloudFiles = db.Issues.SelectMany( i => i.Files );