Entity Framework 一个表多个外键关联另外一张表的相同主键
一. 报错
异常:System.Data.Entity.Infrastructure.DbUpdateException: 更新条目时出错。有关详细信息,请参阅内部异常。 ---> System.Data.Entity.Core.UpdateException: 更新条目时出错。有关详细信息,请参阅内部异常。 ---> MySql.Data.MySqlClient.MySqlException: Unknown column 'o_sawEntity_SawId' in 'field list'
二. 分析

在输出的日志中,可以看到竟然生成三个不存在的列

三. 解决方案
1. T4模板修改, 外键属性加上特性 [ForeignKey(“”)]
改造NavigationProperty方法
为了避免从属性上看,不知道是哪个外键的关联,统一都加上了外键列的名称(非常的丑陋,但是好用T^T)
public string NavigationProperty(NavigationProperty navProp)
{
var endType = _typeMapper.GetTypeName(navProp.ToEndMember.GetEntityType()) + "Entity";
return string.Format(
CultureInfo.InvariantCulture,
@"{5}
{0} {1} {2} {{ {3}get; {4}set; }}
",
AccessibilityAndVirtual(Accessibility.ForNavigationProperty(navProp)),
navProp.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType,
_code.Escape(navProp) + "_" + ((System.Data.Entity.Core.Metadata.Edm.AssociationType)navProp.RelationshipType).ReferentialConstraints[0].ToProperties[0].Name,
_code.SpaceAfter(Accessibility.ForGetter(navProp)),
_code.SpaceAfter(Accessibility.ForSetter(navProp)),
navProp.ToEndMember.RelationshipMultiplicity != RelationshipMultiplicity.Many
? "[ForeignKey(\""+((System.Data.Entity.Core.Metadata.Edm.AssociationType)navProp.RelationshipType).ReferentialConstraints[0].ToProperties[0].Name+"\")]" // 确保主子表、父子关系插入时报错的问题
: ""
);
}
2. T4模板修改, 在列表属性上特性 [InverseProperty("")]
var navigationProperties = typeMapper.GetNavigationProperties(entity);
if (navigationProperties.Any())
{
#> <#
foreach (var navigationProperty in navigationProperties)
{
if (navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many)
{
// 多个外键指向同一个表
var inverseProperty = allNavigationProperties
.FirstOrDefault(a => a.RelationshipType.Name == navigationProperty.RelationshipType.Name
&& a.Name != navigationProperty.Name);
if(inverseProperty != null){
var foreignKeyName= ((System.Data.Entity.Core.Metadata.Edm.AssociationType)navigationProperty.RelationshipType)
.ReferentialConstraints[0].ToProperties[0].Name;
#> [InverseProperty("<#=inverseProperty.Name + "_" + foreignKeyName#>")]
<#
}
#>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
<#
}
#>
<#=codeStringGenerator.NavigationProperty(navigationProperty)#>
<#
}
}
#>
3. 最终效果

4. 编码

在列表属性中加上entity,并标识为Added
Entity Framework 一个表多个外键关联另外一张表的相同主键的更多相关文章
- Entity Framework中Remove、Modified实体时,在修改或删除时引发主键冲突的问题
问题: try { string fileId = context.NewsT.Where(t => t.Id == Model.Id).FirstOrDefault().FileId; str ...
- mysql 一张表的多个字段关联另外一张表
SELECT vtiger_orderitem.orderid, ( SELECT vtiger_users.last_name FROM vtiger_users WHERE vtiger_orde ...
- sql语句 怎么从一张表中查询数据插入到另一张表中?
sql语句 怎么从一张表中查询数据插入到另一张表中? ----原文地址:http://www.phpfans.net/ask/MTc0MTQ4Mw.html 比如我有两张表 table1 字段 un ...
- oracle定时器,调用存储过程,定时从n张表中取值新增到本地一张表中
--创建新增本地数据库的存储过程create or replaceprocedure pro_electric_record as begin insert into electric_met ...
- Mysql复制一条或多条记录并插入表|mysql从某表复制一条记录到另一张表
Mysql复制一条或多条记录并插入表|mysql从某表复制一条记录到另一张表 一.复制表里面的一条记录并插入表里面 ① insert into article(title,keywords,de ...
- Entity framework 7通过代码添加外键关系的方法
这几天研究Asp.net5,也试着写了一些示例代码,因为网上的资料实在是太少了,所以在此把一些问题的解决方法记录下来,以备后查. 问题: 在EF7中,假如数据库已经存在,并且两个表具有外键关系,但是实 ...
- Entity Framework Code First 在Object Join Linq查询时出现全表查询的语句。
最近一个项目,使用微软的Entity Framework的ORM框架的项目,部署到现场后,出现了系统缓慢,多个客户端的内存溢出崩溃的问题. 打开了SQL Server Profiler(SQL Ser ...
- Entity Framework(三):使用特性(数据注解)创建表结构
一.理解Code First及其约定和配置 传统设计应用的方式都是由下而上的,即我们习惯优先考虑数据库,然后使用这个以数据为中心的方法在数据之上构建应用程序.这种方法非常适合于数据密集的应用或者数据库 ...
- powerdesigner设置主键为自增字段,设置非主键为唯一键并作为表的外键
转自:https://www.cnblogs.com/CoffeeHome/archive/2014/06/04/3767501.html 这里powerdesigner连接的数据库是以mysql为例 ...
随机推荐
- 使用 pykafka 进行消费
kafka连接脚本 环境:python3,用到的模块有 pykafka,kazoo # coding=utf-8 import pykafka class KafkaReaderThread(obje ...
- 测试人员必须掌握的linu常用命令
有些公司需要测试人员部署程序包,通过工具xshell. 现在我将总结下工作需要用到的最多的命令 ls 显示文件或目录 pwd ...
- 使用Idea初始化一个spring boot 项目
配置环境 Idea配置jdk8.0 1.打开Idea,点击右上角file,找到Other Settings选项,点击下方的Default Project Structure,如下所示 2.点击下图中所 ...
- djangoNotes
学员管理 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- Ant环境安装
一:下载安装Ant,配置环境变量 1.进入http://ant.apache.org/bindownload.cgi下载ant 2.配置环境变量 新建ANT_HOME 配置path环境变量 配置cla ...
- CI,CD理解
一.什么是CI,CD 当我们在谈论现代的软件编译和发布流程的时候,经常会听到CI 和CD这样的缩写短语.CI很容易理解,就是持续集成. 但是CD既可以指代码持续交付,也可理解为代码持续部署.C ...
- Dumpsys Alarm查看应用程序唤醒命令
Dumpsys alarm查看应用程序唤醒命令: 在安卓adb root进如命令行后(没有root或者root群组的权限执行不了该命令), 1. <span style="font-s ...
- c# 方法的隐藏
- docker 安装elk
https://www.cnblogs.com/fbtop/p/11005469.html
- lombok自定义扩展实践
lombok是一款能够在java代码编译阶段改变代码的插件.比如生成setter和getter方法,生成log类变量等,能够简化一些特定的模版式代码.本文将以实现一个基于特定注解生成日志代码的方式,简 ...