一个影片信息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. JAVA面向对象初步知识总结:封装、继承、多态

    1.封装 把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是是封装.其结果是一个同时带有特征和行为的数据类型.所谓具体实现的隐藏是通过访问权限控制实现的.JAVA 子类重写继承的方法时,不可以 ...

  2. javascript面向对象(三)

    主要内容: 利用原型链的方式实现继承: 原型继承的特点:即继承了父类的模板,也继承了父类的原型对象. 类继承:只继承模板(借用构造函数的方式继承). 利用call.apply方法实现: 混合继承: 扩 ...

  3. Laravel 学习笔记 —— 神奇的服务容器 [转]

    容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于你对该容器的定义.当然,有这样一种容器,它存放的不是文本.数值,而是对象.对象的描述(类.接口)或 ...

  4. mysq安装以及修改密码

    安装版MySQL是不能一键安装的,下载下来是压缩包,解压后只要进行相关配置就可以正常使用: 文章主要是记录一下,以防自己忘记: 1.首先在mysql官网--http://dev.mysql.com/d ...

  5. Git入门仅这篇就够了

    版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/5978937.html 前言 大家好,我是Cavalier ...

  6. iOS开发中的各种错误

    提交iTunesconnect遇到的问题: 1. error itms-90179 Invalid Code Signing. 解决:发现是发布正式被撤销了,重新生成发布Certificates,重新 ...

  7. Web调试利器OpenWindow

    有些时候调试web页面,在循环里面我们不方便设置断点进行调试,或者调试起来比较麻烦,我们就可以用openWindow的方法打印出想要查看的信息,既方便又省时. 代码如下: OpenWindow = w ...

  8. Bootstrap 折叠(Collapse)插件

    折叠(Collapse)插件可以很容易地让页面区域折叠起来.无论您用它来创建折叠导航还是内容面板,它都允许很多内容选项. 如果您想要单独引用该插件的功能,那么您需要引用 collapse.js.同时, ...

  9. Spring学习笔记 5. 尚硅谷_佟刚_Spring_自动装配

    1,回顾以前的做法 一个人有姓名,有住址,有一辆车.其中住址和车也是一个类,这种情况下不用自动装配是十分容易实现的 (1)Person类 package com.zsq; public class P ...

  10. C# 计算字符串在控制台中的显示长度

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...