我正在尝试创建一个链接表,该表将使我的产品表和附件表之间具有多对多关系。
我的课是这样的:
public class Product {
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Accessory> Accessories { get; set; }
}
public class Accessory {
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Machine> Machine { get; set; }
}
public class Type {
public int Id { get; set; }
public string Name { get; set; }
}
如果产品的型号不同,则同一配件可以在一个产品上出现多次,这将在链接表中确定。像这样:
public class ProductAccessoryLink {
public int productId {get; set;}
public int accessoryId {get; set;}
public int typeId {get; set}
public int sort {get; set;}
public string notes {get; set}
}
这是正确的方法吗?
编辑
这是我在运行更新数据库时遇到的错误:
引入外键约束
表格上的'FK_dbo.ProductAccessoryLinks_dbo.Types_TypeId'
“ ProductAccessoryLinks”可能会导致循环或多个级联路径。
指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他
外键约束。无法创建约束。见前
错误。
这是导致错误的sql:ALTER TABLE
[dbo]。[ProductAccessoryLinks]添加约束
[FK_dbo.ProductAccessoryLinks_dbo.Types_TypeId]外键([TypeId])
参考[dbo]。[类型]([Id])在删除级联上
最佳答案
在您的情况下,您需要明确映射联结表。您的模型将如下所示:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<ProductAccessoryLink> ProductAccessoryLinks { get; set; }
}
public class Accessory
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<ProductAccessoryLink> ProductAccessoryLinks { get; set; }
}
public class Type
{
public int Id { get; set; }
public string Name { get; set; }
}
public class ProductAccessoryLink
{
public int ProductId { get; set; }
public int AccessoryId { get; set; }
public int TypeId { get; set; }
public int sort { get; set; }
public string notes { get; set; }
public virtual Type Type { get; set; }
public virtual Product Product { get; set; }
public virtual Accessory Accessory { get; set; }
}
您可以通过以下方式在上下文中配置覆盖
OnModelCreating
方法的关系:protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ProductAccessoryLink>().HasKey(i => new { i.ProductId, i.AccesoryId, i.TypeId});
modelBuilder.Entity<ProductAccessoryLink>()
.HasRequired(i => i.Product)
.WithMany(k => k.ProductAccessoryLinks)
.HasForeignKey(i=>i.ProductId);
modelBuilder.Entity<ProductAccessoryLink>()
.HasRequired(i => i.Accesory)
.WithMany(k => k.ProductAccessoryLinks)
.HasForeignKey(i=>i.AccesoryId);
modelBuilder.Entity<ProductAccessoryLink>()
.HasRequired(i => i.Type)
.WithMany()
.HasForeignKey(i=>i.TypeId);
}
EF使您可以直接配置尝试方式的多对多关系。因此,EF负责使用其要连接的表的适当键在数据库中构建一个连接表。 (键既是联接表的主键,又是指向联接表的外键)。这样一来,您就无需跨联接表就可以获取数据,而不必知道它的存在。但是,当您想对该表进行个性化设置(例如,添加一些其他属性)时,需要如上所示显式映射它。
更新资料
当您有多个级联删除路径时可能会终止尝试删除
Types
表中的同一行,因此会导致该异常。要解决该问题,建议您在此post中检查我的答案关于c# - Entity Framework 代码首先使用附加键进行多对多,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28798236/