由于项目的数据库是Hibernate那边创建的,表B是表A的父表,A中有Bid字段但并没有创建外键与B表关联.
使用EF 直接生成的代码,只能从A中先查询出Bid,再根据Bid去B里面查B表的信息,这样使用太麻烦了.能不能在A中手动添加B对象,直接使用然后又不需要改动数据库呢?
总而言之,就是自定义实体关联,只生成外键字段,不希望在数据库中生成外键.
你现在用的EF是什么版本?我用EF6,你可以重写SqlServerMigrationSqlGenerator的生成外键和更新外键的方法,把不需要的表都过滤掉不就ok了?
public class ExtendedSqlGenerator : SqlServerMigrationSqlGenerator { #region 外键 protected override void Generate(DropForeignKeyOperation dropForeignKeyOperation) { if (IsIgnoreTable(dropForeignKeyOperation.DependentTable)) return; base.Generate(dropForeignKeyOperation); } protected override void Generate(AddForeignKeyOperation addForeignKeyOperation) { if (IsIgnoreTable(addForeignKeyOperation.DependentTable)) return; base.Generate(addForeignKeyOperation); } #endregion }
可以把A的BID与B的ID关联,然后通过管理控制台完成数据库的移植功能更新数据库创建关联。
如果你不想生成外键,那么你只能在A中定义一个类型为B的实体属性,然后设定这个实体属性不被映射到数据库,最后,对这个实体属性处理如下:
public class A { private int _bid; public int Bid { get { return _bid; } set { _bid = value; _b = null; _bLoaded = false; } }
private B _b; private bool _bLoaded = false; public B B { get { if(!_bLoaded) { _b = this.LoadB();
_bLoaded = true; } return _b; } set { if(value == null) { throw ArgumentNotNullException("value"); } _b = value; _bLoaded = true; _bid = _b.Id; } } }
同时,编写以下扩展:
public static AExtensions { public static B LoadB(this A a) { //此处执行通过id加载B的功能 return _bService.GetBById(a.Bid); } }
Entity Framework Code First 配置介绍:引用关系
http://www.dozer.cc/2012/09/entity-framework-code-first-configuring-relationships/