zoukankan      html  css  js  c++  java
  • EntityFrameworkCore 一表对多表存在外键的设计

    表的基本设计

    机械M由多个零件C组成
    不同的零件有不同的属性,所以有C1,C2等等
    由于零件的差异化,导致C1、C2不能通过统一的表C来表示
    同时设计接口InterfaceC作为零件表的接口,整合一些统一的内容
    综上所述,有表M,C1,C2和接口InterfaceC,C1、C2实现InterfaceC

    遇到的问题

    在M表中,定义

    public virtual ICollection<InterfaceC> CList { get; set; }
    

    在C1、C2表中定义

    public int MId { get; set; }
    public virtual M M { get; set; }
    

    在M中配置

    modelBuilder.Entity<M>().HasMany(x => x.CList)
        .WithOne(x => x.M)
        .HasForeignKey(x => x.MId);
    

    报错:
    The specified type 'InterfaceC'must be a non-interface reference type to be used as an entity type .
    即ef core不能接受接口引用类型作为实体类型

    解决方式

    在M表中定义两个集合, 两个集合对应C1、C2表的两个外键

    public virtual ICollection<C1> C1List { get; set; }
    public virtual ICollection<C2> C2List { get; set; }
    

    在C1、C2中分别配置

    modelBuilder.Entity<C1>().HasOne(x => x.M)
        .WithMany(x => x.C1List)
        .HasForeignKey(x => x.MId);
    
    modelBuilder.Entity<C2>().HasOne(x => x.M)
        .WithMany(x => x.C2List)
        .HasForeignKey(x => x.MId);
    

    就ok啦

    题外话

    当然这种数据结构还是推荐使用nosql,mongo的方式
    这里只是刚好讨论到ef core~

  • 相关阅读:
    Linux中连接mysql执行sql文件
    各种编码转化
    PHP 创建缩略图
    erlang入门之编译和运行
    mac下的virtualbox启动失败处理
    golang回调函数的例子
    cocos2d-x的popScene的动画效果
    ssdb的golang驱动的同步问题
    贴一段demo代码,演示channel之间的同步
    golang的指针到string,string到指针的转换
  • 原文地址:https://www.cnblogs.com/Lulus/p/12163333.html
Copyright © 2011-2022 走看看