[EF5.0-CODE FIRST]部分错误集锦

时间:2022-09-29 17:11:17

1.无法确定关系的主体端。添加的多个实体可能主键相同。

Unable to determine the principal end of the 'LetLord.Models.ResidentialProperty_UserProfile' relationship. Multiple added entities may have the same primary key.

    Category root=new Category{ Title="Root" };
    for(int i=0;i<20;i++){
    Category branch =new Category { Title="Branch A"};
    branch.Childs.Add(new Category { Title="Branch A-1"});
    branch.Childs.Add(new Category { Title="Branch A-2"});
    branch.Childs.Add(new Category { Title="Branch A-3"});
    branch.Childs.Add(new Category { Title="Branch A-4"});
    branch.Childs.Add(new Category { Title="Branch A-5"});
    root.Childs.Add(branch);
    }
    db.Categories.Add(root);
    db.SaveChanges();

 场景如上,实体具有自增长的int类型主键时,EF无法自动处理多个同类对象间的主键。可以尝试在Seed中处理时,先制定一个临时主键。EF会根据临时主键的不同来管理不同的实例,在更新数据库时,会自动替换所有的临时主键。

方法如下:

    int Id=0;
    Category root=new Category{ Title="Root",ID=++Id };
    for(int i=0;i<20;i++){
    Category branch =new Category { Title="Branch A", ID=++Id};
    branch.Childs.Add(new Category { Title="Branch A-1", ID=++Id});
    branch.Childs.Add(new Category { Title="Branch A-2", ID=++Id});
    branch.Childs.Add(new Category { Title="Branch A-3", ID=++Id});
    branch.Childs.Add(new Category { Title="Branch A-4", ID=++Id});
    branch.Childs.Add(new Category { Title="Branch A-5", ID=++Id});
    root.Childs.Add(branch);
    }
    db.Categories.Add(root);
    db.SaveChanges();

 该方法来源自:http://e10.in/blog/ef4-multiple-added-entities-may-have-the-same-primary-key

 

2.无法将“update-database”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

此时应该重新注册相关的Nuget引用。

 

3.无法确定依赖操作的有效顺序。由于外键约束、模型要求或存储生成的值,因此可能存在依赖关系。 

一般问题在于1对多关系时的表设计,特别有可能出现在自关联的情况下(如树状结构),此时最好将关联对象设置为可空,或者保证关联顺序正确。如下:

        public virtual EPDepart ParentDepart
        {
            get;
            set;
        }

        [ForeignKey("ParentDepart")]
        public int? ParentId { get; set; }

 4.The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value

据说此问题可能由多个问题引起,比如不在同一个Context下的对象间引用时,由于数据库已保存的对象会被复制一份,此时其时间类型可能被转为空(未经确认,可以参考这里)。解决方法,尽量为时间类型增加默认值或者可空类型。