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. 预训练模型——开创NLP新纪元

    预训练模型--开创NLP新纪元 论文地址 BERT相关论文列表 清华整理-预训练语言模型 awesome-bert-nlp BERT Lang Street huggingface models 论文 ...

  2. 内核crash>>>磁盘空间小 怎么处理

    在内存发生panic时,需要把panic的日志保存下来.以方便日后进行分析. 一般主机为x86的时候,panic 使用 kdump保存log.由于它使用占用大量内存和硬盘.所以当磁盘空间不够时,就会遇 ...

  3. 链路层输出 -qdisc

    二层发送中,实现qdisc的主要函数是__dev_xmit_skb和net_tx_action,本篇将分析qdisc实现的原理,仅对框架进行分析. 其框架如下图所示 qdisc初始化 pktsched ...

  4. wait函数与waitpid函数(僵尸进程)

    当子进程退出时,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程.它只保留最小的一些 ...

  5. 响应式关系数据库处理R2DBC

    目录 简介 R2DBC介绍 项目依赖 创建ConnectionFactory 创建Entity Bean 初始化数据库 获取所有的用户 Prepare Statement 事务处理 WebFlux使用 ...

  6. ceph 的crush算法 straw

    很多年以前,Sage 在写CRUSH的原始算法的时候,写了不同的Bucket类型,可以选择不同的伪随机选择算法,大部分的模型是基于RJ Honicky写的RUSH algorithms 这个算法,这个 ...

  7. Python_用PyQt5 建 notepad 界面

    用PyQt5建notepad界面 1 # -*-coding:utf-8 -*- 2 """ 3 简介:用PyQt5做一个对话框,有菜单(2个.有独立图标.快捷键).提示 ...

  8. 维吉尼亚密码-攻防世界(shanghai)

    维吉尼亚密码 维吉尼亚密码是使用一系列 凯撒密码 组成密码字母表的加密算法,属于多表密码的一种简单形式. 加密原理 维吉尼亚密码的前身,是我们熟悉的凯撒密码. 凯撒密码的加密方式是依靠一张字母表中的每 ...

  9. 美食vlog如何剪辑?用什么视频制作软件剪辑比较好?

    是不是发现自己拍摄的美食永远没有美食博主拍出来的好看?那么美食vlog如何剪辑?用什么视频制作软件剪辑比较好呢?下面小编就教大家用视频编辑软件会声会影强大的颜色分级功能就能拯救你的美食vlog. 接下 ...

  10. css3系列之详解box-shadow

    box-shadow box-shadow呢 是设置元素的阴影效果的,利用这个属性,可以设计很多很炫丽的效果,不信? 等下,学完,我们就来完成下面这两个效果 首先 先了解一下,box-shadow 的 ...