我有一个项目表,其中有许多自己的作业:
public virtual ICollection<Item> Related { get; set; }
modelBuilder.Entity<Item>().HasMany(x => x.Related ).WithMany();
数据:
Item_Id Item_Id1
8 2
8 3
8 4
如何允许重复,例如允许另外8-2,当我尝试插入另一个“重复”数据时,它只显示1。
答案 0 :(得分:2)
我认为问题的根源是误解实体是什么。实体是唯一的,并且具有唯一的ID,因此,例如,公司可以拥有一组独立的雇员,因此您不能在同一个集合中拥有同一个人的两个实例。如果您有购物车,则必须将集合中的项目视为“订单行”而不是项目本身。任何订单行都有自己的Id和对实体的引用,即您正在购买的对象。
答案 1 :(得分:1)
我没有具体检查,所以你可能需要弄清楚细节 -
但是(我认为)这样做的唯一方法是manually define
索引表(例如Item2Item
)。
查看我发布的这篇文章以获取更多信息 EF code-first many-to-many with additional data 这是关于如何为多对多创建自定义表 - 添加 其他领域。
现在你有了一个自定义表,你需要稍微改变一下 - 你需要从.HasKey
中删除复合键。 使用您自己的PK ,例如与任何其他表一样的身份。
即。你可以定义一个独特的PK,像任何其他表一样的身份 - 并将其作为你的密钥。这应该让你的fk列中有重复的键)。
<小时/> 检查这篇文章,因为它似乎在逻辑上接近(虽然不一样)
答案 2 :(得分:0)
这给了我最终解决方案 - &gt; EF Code First, how can I achieve two foreign keys from one table to other table?,NSGaga感谢方向
public class Item : IValidatableObject
{
[Key]
public int ID { get; set; }
public virtual ICollection<ItemRelation> Related{ get; set; }
public string Name { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (....)
{
yield return new ValidationResult("Name not valid", new[] { "Name" });
}
}
}
public class ItemRelation
{
[Key]
public int ID { get; set; }
public int ItemAID { get; set; }
public virtual Item ItemA { get; set; }
public int ItemBID { get; set; }
public virtual Item ItemB { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<ItemRelation>().HasRequired(c => c.ItemA)
.WithMany(m => m.Related)
.HasForeignKey(c => c.ItemAID)
.WillCascadeOnDelete();
modelBuilder.Entity<ItemRelation>().HasRequired(c => c.ItemB)
.WithMany()
.HasForeignKey(c => c.ItemBID)
.WillCascadeOnDelete(false);
}
public DbSet<Item> Items { get; set; }
public DbSet<ItemRelation> ItemsRelations { get; set; }
数据:
Id ItemA_Id ItemB_Id
1 8 2
2 8 3
3 8 5
4 8 5
5 8 5
6 1 6
7 5 4
8 2 9