首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架代码首先多到多有额外的密钥

问实体框架代码首先多到多有额外的密钥
EN

Stack Overflow用户
提问于 2015-03-01 19:46:39
回答 1查看 1.3K关注 0票数 2

我正在尝试创建一个链接表,这将允许我在产品和附件表之间建立多到多个关系。

我的课是这样的:

代码语言:javascript
复制
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; }
}

如果产品是不同的类型,则同一附件可以多次出现在产品上,该类型将在链接表中确定。就像这样:

代码语言:javascript
复制
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}
}

这是正确的方法吗。

编辑

这是我在运行update数据库时遇到的错误:

在表'ProductAccessoryLinks‘上引入外键约束ProductAccessoryLinks可能会导致循环或多个级联路径。指定“删除不操作”或“更新不操作”,或修改其他外键约束。无法创建约束。请参阅先前的错误。 这是导致错误的sql : ALTER dbo.ProductAccessoryLinks添加约束FK_dbo.ProductAccessoryLinks_dbo.Types_TypeId外键(TypeId)引用dbo.Types ON DELETE级联

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-01 20:14:44

在您的情况下,您需要显式地映射连接表。你的模型会是这样的:

代码语言:javascript
复制
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方法的关系:

代码语言:javascript
复制
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负责在数据库中使用它要连接的表的适当键构建一个联接表。(这些键既是连接表的主键,也是指向已连接表的外键)。这样您就可以在join表中获取数据,而不必知道它的存在。但是,当您想要个性化该表(例如,添加一些附加属性)时,您需要显式地映射它,正如我前面所示。

更新

当您有多个级联删除路径,而这些路径可能结束试图删除Types表中的同一行时,就会导致此异常。为了解决这个问题,我建议您在这个post中检查我的答案

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28798236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档