c# - 代码优先:同一实体的一对多关系
问题描述
我有一个Product
可以有多个附加产品的实体。所以我需要一个将 a 映射Product
到附加Product
s 的联结表。
我试图做的是以下内容:
[Table("Product")]
public class Product : EntityBase
{
[Key]
public int Id { get; set; }
public virtual ICollection<Argument> Arguments { get; set; }
public virtual ICollection<Product> AdditionalProducts { get; set; }
}
添加 Products 集合,希望 EF 构建一个联结表。但是,我在迁移中最终得到了这个:
public partial class test1 : DbMigration
{
public override void Up()
{
AddColumn("dbo.Product", "Product_Id", c => c.Int());
CreateIndex("dbo.Product", "Product_Id");
AddForeignKey("dbo.Product", "Product_Id", "dbo.Product", "Id");
}
public override void Down()
{
DropForeignKey("dbo.Product", "Product_Id", "dbo.Product");
DropIndex("dbo.Product", new[] { "Product_Id" });
DropColumn("dbo.Product", "Product_Id");
}
}
我在这里做错了什么?
解决方案
正如你在评论中所说:
一个产品可以是多个产品的附加产品。并且还可以有它的一套附加产品。
所以,首先制作一个模型类,命名AdditionalProduct
如下:
[Table("AdditionalProduct")]
public class AdditionalProduct
{
[Key]
public int Id { get; set; }
public int ProductId {get; set;}
public int AdditionalProductId {get; set;}
public Product Product {get; set;}
public Product AdditionalProduct {get; set;}
}
你的Product
班级应该如下:
[Table("Product")]
public class Product : EntityBase
{
[Key]
public int Id { get; set; }
.......
public virtual ICollection<AdditionalProduct> HisAdditionalProducts { get; set; }
public virtual ICollection<AdditionalProduct> AdditionalProductsTo { get; set; }
}
然后在OnModelCreating
如下:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<AdditionalProduct>()
.HasRequired(m => m.Product)
.WithMany(t => t.HisAdditionalProducts)
.HasForeignKey(m => m.ProductId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<AdditionalProduct>()
.HasRequired(m => m.AdditionalProduct)
.WithMany(t => t.AdditionalProductsTo)
.HasForeignKey(m => m.AdditionalProductId)
.WillCascadeOnDelete(false);
}
推荐阅读
- python - 如何将我的 python 交易机器人上传到互联网进行自动交易?
- python - Python:在日期列表中,如何删除属于连续三天或更长时间范围的日期?
- python - 如何在 2 个不同帐户 S3 存储桶之间复制特定文件
- java - Java 面试题:在 O(log(n)) 时间内通过两个字段获取条目
- php - 使用 ajax 提交表单时刷新 csrf 令牌是个好主意吗?
- c# - 使用对象初始化器实例化类
- python - 使用 C 扩展模块运行 tox
- c# - C# - 查找和替换文件中的特定字符串
- git - 有没有办法使用 TortoiseGit 初始化远程 git 存储库?
- ios - 无法在 iOS 中使用 UIActivityViewController 通过 Twitter 发布视频