ef 问题汇总

持续更新:


一  属性重命名

数据库:UserName

Model: 

[Column("UserName")]
public string UserName222


二, 某表多个外指向同一表的主键。

数据库 :

//主表
public partial class MainTable
    {
        public MainTable()
        {
            this.SubTable1 = new HashSet<SubTable>();
            this.SubTable2 = new HashSet<SubTable>();
        }

        [Key]
        public int MainTableID { get; set; }
        
        
        [InverseProperty("MainTable1")]
        public virtual ICollection<SubTable> SubTable1 { get; set; }
        [InverseProperty("MainTable2")]
        public virtual ICollection<SubTable> SubTable2 { get; set; }
        
    }

//从表
public partial class SubTable
    {
        [Key]
        public int SubTableID { get; set; }
        public Nullable<int> MTID1 { get; set; }
        public Nullable<int> MTID2 { get; set; }


        [ForeignKey("MTID1")]
        public virtual MainTable MainTable1 { get; set; }
        [ForeignKey("MTID2")]
        public virtual MainTable MainTable2 { get; set; }

    }


三, 对于ef报错无法生成复杂sql的问题

很常见的是 

在 LINQ to Entities 查询中无法构造实体或复杂类型

The entity or complex type 'Snd.EF.dttree' cannot be constructed in a LINQ to Entities query

var q=db.Users.ToList().select(x=>new xxx(){
id=x.id,
pwd=x.pwd,
company=db.Company.first(x.id)
}).ToList()
记得先.tolist,把数据放到内存中。而不是让ef去帮你生成一个嵌套的复杂sql。(貌似有时不先.tolist()可以,有时不可以。这个没深究)


四 Entity Framework 支持 DataTable

http://blog.csdn.net/hanjun0612/article/details/51026673


五 遇见ef修改时,报错:已经具有跟踪的目标。。。。

在查询时,使用AsNoTracking()


六,

错误 : 支持“Entities”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库(http://Go.microsoft.com/fwlink/?LinkId=238269)


我出现这个错误的原因是,我对数据库进行了修改,而实体层没有修改。当我采用code first更新的时候,就报错了。

解决方法:

到数据库,点开系统表,找到  __MigrationHistory  删除即可


七, 数据更新了,但是ef更新后,字段没出现的问题。

删除ef,重新创建即可。但是由于重新创建,导致之前的添加的许多notmapped属性或者标签都会没有。所以要谨慎!!!一般我还是推荐 code first。这样不容易改坏。



八, 添加不映射的字段

使用NotMapped属性,简单理解就是扩展了实体层。但是并不参与数据库的交互。

public partial class Model
    {

        [Key]
        public int ID { get; set; }
        
        [NotMapped]
        public bool isChecked { get; set; }

        [ForeignKey("ListID")]
        public virtual SubModel Sub { get; set; }
    }


九, ef上下文 dbcontext使用 using

不建议使用如下代码

//这样容易造成资源已释放的错误!
using (DBContext db = new DBContext())
{
      var q=db.User.ToList();
}

//我们应该直接
DBContext db = new DBContext()


十, ef复杂实体 无法序列化成 json的问题。

使用 newtonsoft 序列化 带有外键的实体层时,很容易报错(类似于死循环的一个错误)。

错误的本身很简单,是说你的关联对象有一个 foreignkey,所以他去序列化关联对象了。结果在关联对象里,又发现了你的主键对象(主外键关系,一定在2个类中会存在的)。结果又回到主键对象反序列化,结果又发现了外键对象。如此反复。所以报错了。

解决方法比较简单:在属性上增加 [JsonIgnore] 属性。不过这也会导致从此以后,他再也不会  被序列化  以及  反序列化

public partial class Model
    {

        [Key]
        public int ID { get; set; }

        [JsonIgnore]
        public virtual SubModel Sub { get; set; }
    }

十一, The remote certificate is invalid according to the validation procedure

数据库连接字符串,增加以下    MultipleActiveResultSets=true;

    <add name="Test" connectionString="server=.;database=Test;uid=sa;pwd=sasa;Enlist=true;Pooling=true;Max Pool Size = 300; Min Pool Size=0; Connection Lifetime = 300;packet size=1000;MultipleActiveResultSets=true;" providerName="System.Data.SqlClient" />
    <add name="Test1" connectionString="Data Source=.;Initial Catalog=Test;User id=sa;Password=sasa;MultipleActiveResultSets=true;" providerName="System.Data.SqlClient" />


十二, 列名  "xxx.xxID"不存在

1 可能数据库不存在这个列

  解决:增加数据库字段

2 newtonsoft.json的问题,不要使用9.00以上版本,存在bug(楼主自己遇见过,不吹不黑,换成6.0.0版本就好了,巨坑!!!)

  解决:通过nuget 卸载所有newtonsoft.json。然后删除所有类库下的packages.config,最后手动添加6.0.0版本引用


十三,Error getting value from 。。。  System.Data.Entity.DynamicProxies。。。。。。

在创建 DBContext时 ,设置  

_nContext.Configuration.ProxyCreationEnabled = false; 


十四, EF 不指定 数据库链接

那么数据库文件会生成在:App_Data 中。

请详细看一下问题,在试试如下方法

数据库不存在时重新创建数据库:

Database.SetInitializer<testContext>(new CreateDatabaseIfNotExists<testContext>());

 

 每次启动应用程序时创建数据库:

Database.SetInitializer<testContext>(new DropCreateDatabaseAlways<testContext>());

 

模型更改时重新创建数据库:

Database.SetInitializer<testContext>(new DropCreateDatabaseIfModelChanges<testContext>());

 

从不创建数据库:

Database.SetInitializer<testContext>(null);


十五 , 表名复数问题

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention>(); 
        }


十六,列名 Discriminator 无效

详见:https://blog.csdn.net/hanjun0612/article/details/80077425


十七,列名 XXXID 无效

在查询对象以及关联对象时。出现的这个问题。

解决方案:

1 数据库可能没有关联id

2 如果你是这么创建对象的话

在关联对象上,指定ForeignKey(指向属性名)
public partial class WD_MyProject
    {
        [Key]
        public int id { get; set; }
        public int uid { get; set; }

        [ForeignKey("uid")]
        public virtual WD_Employee WD_Employee { get; set; }

    }

可以尝试反过来:

在属性上,指定ForeignKey(关联对象名)
public partial class WD_MyProject
    {
        [Key]
        public int id { get; set; }
        [ForeignKey("WD_Employee")]
        public int uid { get; set; }

        
        public virtual WD_Employee WD_Employee { get; set; }

    }

PS :  

这两种方法都是正确的(ForeignKey中的参数指向不同)。但是我在项目中就是遇到了使用第二种才能正常运行的情况。

msdn上是这么说的:




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值