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. Visual Studio2013应用笔记---WinForm事件中的Object sender和EventArgs e参数

    Windows程序有一个事件机制.用于处理用户事件. 在WinForm中我们经常需要给控件添加事件.例如给一个Button按钮添加一个Click点击事件.给TextBox文本框添加一个KeyPress ...

  2. 性能工具-CPU

  3. python之路《九》 迭代器与生成器

    1.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...

  4. Freebsd10.2安装包升级pkg引起环境破坏的解决

    前言 freebsd10.2环境在安装一个新软件包的时候提示升级pkg到1.10.1,然后点击了升级,然后整个pkg环境就无法使用了 记录 升级完了软件包以后第一个错误提示 FreeBSD: /usr ...

  5. 原生sql查询返回结果集处理方法

    今天博主用原生写查询的时候发现,查询出来的居然不是我数据表里的数据,而是一个对象 object(mysqli_result)#2 (5) { ["current_field"]=& ...

  6. ci爬坑

    1.row_array() 问题描述:没有数据返回NULL,直接foreach,报错

  7. c# 调用Go 动态库

    [StructLayout(LayoutKind.Sequential)] public struct GoMem { public IntPtr data; public UInt64 len; p ...

  8. 全网最全!这份深入讲解jdk和jvm原理的笔记,刷新了我对JVM的认知

    前言 前两天和朋友探讨技术的时候有聊到JVM和JDK这一块,聊到这里两个人就像高山流水遇知音那是根本停不下来,事后我想着趁现在印象还比较深刻就把这些东西整理起来分享给大家来帮助更多的人吧.话不多说,满 ...

  9. 用Camtasia来快速地给视频添加水印

    在日常生活中,视频的流行度越来越高,各种短视频的软件蜂拥上市,所以越来越多的人走上了自媒体的道路,在这条路上,谁的视频更加的精致,谁才能获得更多的关注度,相应的也能增加自己的人气. 但是在制作视频的过 ...

  10. 一个定时任务管理器,基于Go语言和beego框架开发

    链接 https://github.com/lisijie/webcron 安装说明 系统需要安装Go和MySQL. 获取源码 $ go get github.com/lisijie/webcron ...