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. Spring源码之@Lazy和预实例化

    https://www.cnblogs.com/yanze/p/10243348.html 懒加载优缺点 优点:懒加载,对象使用的时候才去创建:启动速度快,节省资源 缺点:不利于提前发现错误:初次请求 ...

  2. 【Python】Json序列化和反序列化模块dumps、loads、dump、load函数介绍

    1.json.dumps()  json.dumps()用于将dict类型的数据转成str,因为如果直接将dict类型的数据写入json文件中会发生报错,因此在将数据写入时需要用到该函数. 转换案例: ...

  3. SQL SERVER数据库使用过程中系统提示死锁处理办法

    马上双节(国庆节.中秋节)了,这篇文章是双节前的最后一篇,祈祷过节期间,数据库稳定运行,服务器正常发挥.祝大家假期愉快!!!! 任何的数据库都会出现死锁的情况,特别是一些大型的复杂业务,数据库架构的设 ...

  4. 还是畅通工程(最小生成树 并查集 Prim Kruskal)

    Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只 ...

  5. SpringBoot 之 @ControllerAdvice 拦截异常并统一处理

    在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@ModelAttribute,并应用到所有@Requ ...

  6. HDU100题简要题解(2060~2069)

    这十题感觉是100题内相对较为麻烦的,有点搞我心态... HDU2060 Snooker 题目链接 Problem Description background: Philip likes to pl ...

  7. 【老孟Flutter】自定义文本步进组件

    交流 老孟Flutter博客(330个控件用法+实战入门系列文章):http://laomengit.com 欢迎加入Flutter交流群(微信:laomengit).关注公众号[老孟Flutter] ...

  8. FL Studio 插件使用教程 —— 3x Osc(上)

    在FL Studio20 中,3x Osc是继TS404插件之后资历最老的插件之一,也是FL Studio20 中最重要.使用率最高的插件之一.相比别的FL Studio20内置插件,3x Osc 相 ...

  9. 使用Camtasia制作蒙面唱将揭面视频

    要说之前的<蒙面唱将猜猜猜>还是属于比较火的歌唱综艺节目了.这档歌唱类型的综艺节目的精彩点不在于歌唱的水平,而在于猜想的环节.演唱时,嘉宾们都会蒙上面具,直到被评委猜中时才会揭开面具. 我 ...

  10. leetcode 108 和leetcode 109 II

    //感想:没啥上篇写完了 //思路:对于这道题109来说,就是数组变成了链表,其他没有变,我觉得非常不解,因为我想到的依旧是找中点,用快慢指针来找, 找到以后将链表分成两半,继续递归的去找,我就觉得这 ...