一个影片信息Clips表,四个字段:clipId,clipName,fileSize,fileName

方案一:

    [Table("Clips")]
public class Clip
{
public Clip()
{
File = new ClipFile();
} [Key]
[Column("clipId")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; } [Column("clipName")]
public string Name { get; set; } public ClipFile File { get; set; }
} [ComplexType]
public class ClipFile
{
[Column("fileSize")]
public string Size { get; set; } [Column("fileName")]
public string Name { get; set; }
}

缺点:ClipFile不会延迟加载,无论你ClipFile申明是否为virtual的。

方案二:

[Table("Clips")]
public class Clip
{
[Key]
[Column("clipId")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[ForeignKey("FileOf")]
public int Id { get; set; } [Column("clipName")]
public string Name { get; set; } //[Required]
public virtual ClipFile FileOf { get; set; }
} [Table("Clips")]
public class ClipFile
{
[Key]
[Column("clipId")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[ForeignKey("ClipOf")]
public int Id { get; set; } [Column("fileSize")]
public string Size { get; set; } [Column("fileName")]
public string Name { get; set; } //[Required]
public virtual Clip ClipOf { get; set; }
}

这种方案也存在问题,不Include调用关联virtual实体类,永远是null,不支持延迟加载,很是郁闷。SqlServer据说可以解决,MySql我是没有找到解决方案。

还有就是构造函数一定不要去new附属实体类,会进入死循环。

方案三:使用TPH(Table per Hierarchy)

public abstract class ClipBase
{
[Key]
[Column("clipId")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; } [Column("clipName")]
public string Name { get; set; }
} public class ClipFile : ClipBase
{
[Column("fileName")]
public string FileName { get; set; }
} public class ClipSize : ClipBase
{
[Column("fileSize")]
public int Size { get; set; }
}

而且必须是用Fluent API进行配置,还必须为Clips添加字段Discriminator(字段名称和类型都可以根据自己需要进行修改),这个字段的值用于区分是哪个类的数据,所以务必保证每个派生类的HasValue值不相同。

modelBuilder.Entity<ClipBase>().Map(m=>
{
m.ToTable("Clips");
//m.Requires("Discriminator").HasValue("0"); //如果ClipBase不申明为抽象类这需要用此加以区分
})
.Map<ClipFile>(m => m.Requires("Discriminator").HasValue(""))
.Map<ClipSize>(m => m.Requires("Discriminator").HasValue(""));

创建对象可以用基类的DbSet进行添加,也可以用派生类自己的DbSet进行添加。选取的时候你可以基类的DbSet.OfType<ClipFile>(),也可以用派生类自己的DbSet。

但是这种方案多实体其实就导致数据虽然在一个表,但是内容无法在三个类中共享了,失去了原有的设计初衷。

Entity FrameWork 单表对多实体的更多相关文章

  1. [Programming Entity Framework] 第3章 查询实体数据模型(EDM)(一)

    http://www.cnblogs.com/sansi/archive/2012/10/18/2729337.html Programming Entity Framework 第二版翻译索引 你可 ...

  2. Visual Studio2017中如何让Entity Framework工具【ADO.NET实体数据模型】支持MYSQL数据源

    熟悉Entity Framework应该对以下图片不陌生,他就是ADO.NET实体数据模型向导:可以将数据库的表自动生成模型类,或者创建Code First的模型文件. 但是这个模型向导默认只显示微软 ...

  3. Entity Framework入门教程:创建实体数据模型

    下图为一个已经创建好的数据库表关系 实体数据模型的创建过程 在Visual Studio项目中,右键程序集菜单,选择[添加]->[新建项],在[添加新项窗口]中选择[ADO.NET实体数据模型] ...

  4. Entity framework 加载多层相关实体数据

    Entity framework有3种加载数据的方式:懒汉式(Lazy loading),饿汉式(Eager loading),显示加载(Explicit loading).3种加载方式有各自的优缺点 ...

  5. 手动写Entity Framework 数据库上下文和Model实体

    1.引用EF对应的程序集 使用命令安装EntityFramework包Install-Package EntityFramework Entity Framework简单目录: 1.context数据 ...

  6. Entity Framework 一个表多个外键关联另外一张表的相同主键

    一. 报错 异常:System.Data.Entity.Infrastructure.DbUpdateException: 更新条目时出错.有关详细信息,请参阅内部异常. ---> System ...

  7. entity framework core 生成 postgresql 数据库实体

    .net core 2.0 使用db first 方式生成 表 和context PM 控制台运行命令出错 Scaffold-DbContext "Host=localhost;Databa ...

  8. Entity Framework(EF) Code First将实体中的string属性映射成text类型的几种方式

    1.通过ColumnType属性设置 [Column(TypeName="text")] public string Text { get; set; } 在进行以上属性设置时,请 ...

  9. Entity Framework: 主从表的增删改

    1.根据主表添加从表数据 var dest = (from d in context.Destinations where d.Name == "Bali" select d).S ...

随机推荐

  1. Unbunt vi 编辑器键盘按键不正确的一次经历与解决方案

    在 VMWare 上安装了 Ubuntu Server 14.04.1(这个默认没有安装 vim ) 我在配置网卡的时候,编辑得很心碎.键盘输入和平常vi的响应完全不一样.又不能用 SecureCRT ...

  2. 2-4. Using auto with Functions

    在C++14中允许使用type deduction用于函数参数和函数返回值 Return Type Deduction in C++11 #include <iostream> using ...

  3. Oracle 学习方法

    参考书籍: oracle实用教程 pdf 深入浅出Oracle: DBA入门.进阶与诊断案例.pdf Oracle 认证 Dba 认证: Oca  oracle 初级dba 认证(容易) Ocp  o ...

  4. php的cookie和session相同主域名共享

    如何使用chrome查看cookie和session详见另一篇文章,点这里 首先说cookie, $cookieDomain = '.elf.com'; setcookie('elf', 'im el ...

  5. MySQL 5.7系列之sys schema(2)

    0.导读 MySQL 5.7引入了sys schema,有了它,我们排查分析一些问题时将更得心应手.sys schema里主要存储的是视图.存储过程.函数等. 视图:用于结果的汇总展示及配置持久化: ...

  6. 引入Ember插件 大概流程

    引入Ember插件 xxx (转自美女同事 LZX) 1.ember install xxx(过程中可能会提示你安装其他包 按照提示语安装就行)   2.安装之后会看到 工作目录里已经出现了下载好的安 ...

  7. Java Web2

    JavaBean组件. 定义方法:(假设有一个JavaBean的类名为CounterBean,它有一个count属性.) //在JSP文件中分别定义4种范围内的JavaBean对象的语法 //in p ...

  8. Hibernate和jsp做数据库单表的增删改查

    虽然很基础,但是我转牛角尖了~~~~这是几个文件 1.最重要的.Java文件 package com.chinasofti.hibb.struts; import org.hibernate.Sess ...

  9. Python 第五天 模块(2)

    模块,用一砣代码实现了某个功能的代码集合. 有两种存在的方式 1.写到一个文件夹里面 2.py文件 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和 ...

  10. 完全用CSS实现的表格

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...