1. 多个实体映射到一张表
Code First允许将多个实体映射到同一张表上,实体必须遵循如下规则:
  • 实体必须是一对一关系
  • 实体必须共享一个公共键
我们通常有这样的需求,如:同一基类派生出的不同数据模型,想方便管理便放到一张表中。
如下:
AssayAction为基类
AddSampleAction 为派生类
DilutionAction 为派生类
最张生成到一张表中。
 
系统在默认情况下生成同一张表。
代码示例如下:
//=====================================================
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
 
namespace EFSqlCEDemo
{
public abstract class AssayAction
{
#region 属性
[Key]
public Guid ID {get; set;}
 
public string Name {get;set;}
public int Index {get; set;}
public int Dutration {get;set;}
 
public int RepeatCount {get;set;}
 
public double DefaultValue {get;set;}
 
///<summary>
///试剂ID
///</summary>
public virtual Guid ReagentID {get; set;}
 
#endregion
 
#region 构造函数
/// <summary>
/// 新实例
/// </summary>
public AssayAction()
{
ID = Guid.NewGuid();
Name = "";
Dutration = 0;
DefaultValue = 0;
RepeatCount = 1;
//ReagentID =
}
#endregion
}
}
 
 
public class AddSampleAction : AssayAction
{
public int AspirateSampleVolume { get; set; }
 
}
 
public class DilutionAction : AssayAction
{
public int DilutionRatio { get; set; }
 
public int AspirateSampleVolume { get; set; }
}
 
 
//=======================================================
//
//=======================================================
public class MyDatabaseContext : DbContext
{
public MyDatabaseContext()
:base("Data Source=Assay.sdf;")
{
}
 
public IDbSet<AssayAction> AssayActions { get; set; }
}
 
 
 
/// <summary>
/// 仅在数据库不存在时重新创建数据库并选择重新设置数据库的种子
/// </summary>
public class MyDatabaseInitializer : CreateDatabaseIfNotExists<MyDatabaseContext>
{
MyDatabaseContext _databaseContext;
 
/// <summary>
/// 数据库初始化数据
/// </summary>
/// <param name="context"></param>
protected override void Seed(MyDatabaseContext context)
{
base.Seed(context);
_databaseContext = context;
//获取数据库连接
var connection = ((IObjectContextAdapter)context).ObjectContext.Connection;
//打开连接
connection.Open();
//开始事物
var transaction = connection.BeginTransaction(System.Data.IsolationLevel.RepeatableRead);
try
{
DefaultData();
context.SaveChanges();
//提交事物
transaction.Commit();
}
catch (Exception e)
{
//回滚事物
transaction.Rollback();
throw new Exception("初始化数据库失败,详情请查看内部异常!", e);
}
finally
{
//关闭连接
connection.Close();
}
 
}
 
public void DefaultData()
{
AddSampleAction act1 = new AddSampleAction() { AspirateSampleVolume = 10, Name="aaaaaaaaaaa"};
DilutionAction act2 = new DilutionAction() { AspirateSampleVolume = 10, Name="bbbbbbbbbbbbbb", DilutionRatio = 100 };
_databaseContext.Set<AssayAction>().Add(act1);
_databaseContext.Set<AssayAction>().Add(act2);
_databaseContext.SaveChanges();
}
}
 
 
读写:
 
private void ButtonRead_Click(object sender, RoutedEventArgs e)
{
foreach (var item in MyDatabaseContext.AssayActions.Where(x => x.ID != null))
{
tbInfo.Text += item.Name + " Index=" +item.Index+ "\r\n";
}
 
}
 
private void Modify_Click(object sender, RoutedEventArgs e)
{
AssayAction action = MyDatabaseContext.AssayActions.First(x => x.Name == "aaaaaaaaaaa");
if (action != null)
{
action.Index ++;
DataBusinessBase<AssayAction> actionDB = new DataBusinessBase<AssayAction>();
actionDB.DBContext = this.MyDatabaseContext;
actionDB.Update(action);
}
}
 
 
2. 多个实体映射到各自表中
将各自的类标记自己的表名。
[System.ComponentModel.DataAnnotations.Schema.Table("AddSampleActions")]
[Serializable]
public class AddSampleAction : AssayAction
{
public int AspirateSampleVolume { get; set; }
}
 
[System.ComponentModel.DataAnnotations.Schema.Table("DilutionActions")]
[Serializable]
public class DilutionAction : AssayAction
{
public int DilutionRatio { get; set; }
 
public int AspirateSampleVolume { get; set; }
}
 
程生成成功,但运行开始时出现异常:
类型“System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy”的方法“ExecuteAsync”没有实现
解决方法:
1.检查引用的 EntityFramework 是否为引用的Framework4.5
2.检查引用的 EntityFramework.sqlServer
查看其中EntityFramework.sqlServer是否有System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy
的方法:ExecuteAsync
果然没有。
重新引用Nuget下载的EF6.2中的4.5文件夹中的dll。
3.清理,重新生成,果然成功.
 
 

EF CodeFirst多个数据摸型映射到一张表与各一张表的更多相关文章

  1. 20.1翻译系列:EF 6中自动数据迁移技术【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/automated-migration-in-code-first.aspx EF 6 ...

  2. 9.翻译系列:EF 6以及EF Core中的数据注解特性(EF 6 Code-First系列)

    原文地址:http://www.entityframeworktutorial.net/code-first/dataannotation-in-code-first.aspx EF 6 Code-F ...

  3. EF Code-First数据迁移

    Code-First数据迁移  首先要通过NuGet将EF升级至最新版本. 新建MVC 4项目MvcMigrationDemo 添加数据模型 Person 和 Department,定义如下: usi ...

  4. 【EF】EF Code-First数据迁移

    Code-First数据迁移  首先要通过NuGet将EF升级至最新版本. 新建MVC 4项目MvcMigrationDemo 添加数据模型 Person 和 Department,定义如下: usi ...

  5. 关于EF中实体和数据表以及查询语句映射的问题

    关于EF中实体和数据表以及查询语句映射的问题? 很多人在使用的时候分不清楚 实体字段应该少于等于(数据库中的表字段或者SQL查询中的临时字段).这样在查询或者添加修改都不会出现问题 如果实体的字段大于 ...

  6. EF CodeFirst数据注解特性详解

    数据注解特性是.NET特性,可以在EF或者EF Core中,应用于实体类上或者属性上,以重写默认的约定规则. 在EF 6和EF Core中,数据注解特性包含在System.ComponentModel ...

  7. EF里Guid类型数据的自增长、时间戳和复杂类型的用法

    通过前两章Lodging和Destination类的演示,大家肯定基本了解Code First是怎么玩的了,本章继续演示一些很实用的东西.文章的开头提示下:提供的demo为了后面演示效果,前面代码有些 ...

  8. 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...

  9. EF Codefirst 多对多关系 操作中间表的 增删改查(CRUD)

    前言 此文章只是为了给新手程序员,和经验不多的程序员,在学习ef和lambada表达式的过程中可能遇到的问题. 本次使用订单表和员工表建立多对多关系. 首先是订单表: public class Ord ...

随机推荐

  1. quic是干什么的?

    什么是quic? quic解决了什么问题?HTTP和QUIC QUIC :Quick UDP Internet Connections:是一种新的默认加密的互联网通信协议,它提供了许多改进,旨在加速H ...

  2. tcpack--3快速确认模式

    接收到数据报后,会调用tcp_event_data_recv(),不管是在慢速路径的tcp_data_queue中调用还是 在快速路径中处理接收数据后直接调用,注意(如果len <= tcp_h ...

  3. close与shutdown

    首先看一个例子,如下图所示: 当我们客户端发送ABCD再close套接字的时候,服务器端的接收通道也被关闭了,将无法接收ABCD的数据.如果想要仅仅关闭发送通道,保留接收通道,可以使用shutdown ...

  4. HotSpot的启动过程(配视频进行源码分析)

    本文将详细介绍HotSpot的启动过程,启动过程涉及到的逻辑比较复杂,细节也比较多,为了让大家更快的了解这部分知识,我录制了对应的视频放到了B站上,大家可以参考. 第4节-HotSpot的启动过程 下 ...

  5. centos6 安装 terminator

    yum install terminator 报错: No package terminator available. 解决: yum install epel-release 报错 Cannot r ...

  6. IIC、SPI、UART协议总结

    IIC 特点 1.Inter-Integrated Circuit,内部集成总线,半双工 2.短距离传输,有应答,速度较慢 3.SDA双向数据线,SCL时钟线 4.可以挂载多个设备,IIC设备有固化地 ...

  7. 关于android.view.InflateException【转载】

    在AndroidStudio中编译没有问题,但是运行时会crash,常发生于自定义View的引用.出现问题的原因大致分为以下几种 1.引用View的路径问题:如果自定义的view为CustomerVi ...

  8. C# 9.0新特性详解系列之二:扩展方法GetEnumerator支持foreach循环

    1.介绍 我们知道,我们要使一个类型支持foreach循环,就需要这个类型满足下面条件之一: 该类型实例如果实现了下列接口中的其中之一: System.Collections.IEnumerable ...

  9. MySQL 的常用引擎

    1. InnoDB InnoDB 的存储文件有两个,后缀名分别是 .frm 和 .idb,其中 .frm 是表的定义文件,而 idb 是数据文件. InnoDB 中存在表锁和行锁,不过行锁是在命中索引 ...

  10. SMB远程代码执行漏洞(CVE-2020-0796)分析、验证及加固

            这几天有点忙,CVE-2020-0796出来了,没静下心来关注一下,显得太不尊重这个漏洞了,今天周末,关注一下,水一篇. 一.漏洞描述       漏洞公告显示,SMB 3.1.1协议 ...