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. minishell的实现

    直接上各个模块的代码,注释都在文档代码中,非常详细,加上最后的Makefile文件完全可以自行运行看懂: main函数一个文件main.c 1 /* 2 minishell实现的功能:简单命令解析.管 ...

  2. 设计模式之工厂模式(Factory模式)

    在面向对象系统设计中经常遇到以下两类问题: 1)为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口.这样我们可以通过声明一个指向基类的 ...

  3. mysql建立索引,实际工作中建立索引的示例

    1.根据业务场景建立相应的组合索引,一般是在主键,外键,常用来筛选查询的字段,按照字段之间组合的紧密程度,建立一定顺序的索引. 例如:为 t_org_exam_join_member_day  建立索 ...

  4. linux文本模式和文本替换功能

    linux文本有:正常模式,编辑模式,可视化模式,命令模式. 正常模式进入编辑模式下的快捷键: i  --光标当前位置输入 a --光标位置后输入(append) I --行首输入 A --行尾输入 ...

  5. mdtest测试工具

    软件介绍 mdstest是软件的元数据操作基准测试工具,用来模拟对文件或者目录的open.stat.close操作,然后报告性能 下载软件压缩包: yum install openmpi openmp ...

  6. 测试_QTP使用实例

    1. QTP简介 1.1QTP功能与特点 QTP是QuickTest Professional的简称,是一种自动化软件测试工具.在软件的测试过程中,QTP主要来用来通过已有的测试脚本执行重复的手动测试 ...

  7. centos 6系统下新磁盘分区(MBR格式)

    添加新磁盘后,fdisk -l查看所有磁盘列表( fdisk只能分区2T以下磁盘,超过2T的用parted命令来进行GPT分区) 然后fdisk -cu /dev/sdb选择要分区的磁盘,按m显示菜单 ...

  8. kubernetes个人笔记(一)

    一.证书工具 CFSSL keytools,openssl 1.介绍 CFSSL is CloudFlare's PKI/TLS swiss army knife. It is both a comm ...

  9. Wasp XT合成器功能介绍

    本章节将采用图文结合的方式给大家讲解电音编曲软件FL Studio中的Wasp XT合成器的相关功能,感兴趣的朋友可以一起来交流哦. 下面我们一起来看看吧 Wasp XT是一个3振荡器合成器,它包含一 ...

  10. ABBYY FineReader 15 如何为PDF文档添加页眉页脚

    页眉.页脚是文档页面顶部或底部重复出现的文本信息.很多用户会习惯在文档页面的顶部与底部区域添加页眉.页脚来展现页码.文档标题.作者姓名.品牌名称等附加信息.而ABBYY FineReader 15(W ...