首页 新闻 会员 周边 捐助

EF code first 外键配置的可空 生成的Migrations属性为不可空

0
悬赏园豆:15 [已解决问题] 解决于 2016-11-11 17:13

实体

[ForeignKey("juchuId")]
public virtual TFzm004 juchuTFzm004 { get; set; }

/// <summary>
/// JUCHU_ID
/// </summary>
[Column("JUCHU_ID", TypeName = "numeric")]
public virtual decimal? juchuId { get; set; }

 

 

关联实体

/// <summary>
/// TFcd008
/// </summary>
[ForeignKey("juchuId")]
public virtual IList<TFcd008> TFcd008s { get; set; }

 

 

实体已经配置成可空 为什么生成的Migrations就变成非空了 如下

public partial class test1 : DbMigration
{
public override void Up()
{
DropIndex("dbo.T_FCD008", new[] { "JUCHU_ID" });
AlterColumn("dbo.T_FCD008", "JUCHU_ID", c => c.Decimal(nullable: false, precision: 38, scale: 0, storeType: "numeric"));
CreateIndex("dbo.T_FCD008", "JUCHU_ID");
}

public override void Down()
{
DropIndex("dbo.T_FCD008", new[] { "JUCHU_ID" });
AlterColumn("dbo.T_FCD008", "JUCHU_ID", c => c.Decimal(precision: 38, scale: 0, storeType: "numeric"));
CreateIndex("dbo.T_FCD008", "JUCHU_ID");
}
}

 

这个是ef就这么设置的还是说有接口可以配置呀

< >
分享
最佳答案
0

没看出来有问题,你是1对多呀,多的这个表里面关系id当然不能可空的呀。不然一对多关系都没有了。

 

收获园豆:15
czd890 | 专家六级 |园豆:14488 | 2016-11-11 14:57

这概念到是不太清楚 1对多的情况不能1对0么。。。。  现在确实有这个需求 从oracle导到mssql上 元表就是可以为空的列 

AlterColumn("dbo.T_FCD008", "JUCHU_ID", c => c.Decimal(nullable: false, precision: 38, scale: 0, storeType: "numeric"));

 

nullable: false,  我可以把这个注释掉实现  但是感觉不是解决的办法。。

15904915314 | 园豆:215 (菜鸟二级) | 2016-11-11 15:00

@面惧超人: 一对多里面,多可以是0个,但是多个里面的1不能是null呀,是不

czd890 | 园豆:14488 (专家六级) | 2016-11-11 15:03

@calvinK: 1没有空呀  1的key是主key  多的key才是ForeignKey 


/// <summary>
/// JUCHU_ID
/// </summary>
[Column("JUCHU_ID", TypeName = "numeric")]
public virtual decimal? juchuId { get; set; }  这里这个是外键

15904915314 | 园豆:215 (菜鸟二级) | 2016-11-11 15:04

//一

class A{

list<B> b{get;set;}

}

//多

class B{

int aId{}

A a{get;set;}

}

你说B表里面的aid字段能为null么,如果他为null,那一对多关系还存在么。主外键约束也不成立呀,是不

czd890 | 园豆:14488 (专家六级) | 2016-11-11 15:07

@calvinK: 就你举的这个例子  1对0 的情况是什么样子呢 不就是B表里的a为空么

难道是B表里的a是A表里没有的数据么,这样就违反了外键约束了

15904915314 | 园豆:215 (菜鸟二级) | 2016-11-11 15:21

@面惧超人: 1对0.是B表没有数据,不是aid字段为null。

czd890 | 园豆:14488 (专家六级) | 2016-11-11 15:27

@calvinK: 那也就是说在orm中 外键是不可以为空的了吗

15904915314 | 园豆:215 (菜鸟二级) | 2016-11-11 15:28

@面惧超人: 不光是orm,数据库也是一样的。

czd890 | 园豆:14488 (专家六级) | 2016-11-11 15:29

@calvinK: 数据库是可以的...oracle mssql mysql都可以 postgre没试过

15904915314 | 园豆:215 (菜鸟二级) | 2016-11-11 15:30

@calvinK: 而且就code frist 在migrations里 直接删掉nullable: false生成的数据库就是可以为空的 但是在生成migrations的时候 无论如何设置都会被加上nullable: false

15904915314 | 园豆:215 (菜鸟二级) | 2016-11-11 15:32

@面惧超人: 

我刚才测试了一下。没有你这个问题。自动迁移可以设置为null。是否是你ef版本的问题

czd890 | 园豆:14488 (专家六级) | 2016-11-11 16:14
public class MyDb : DbContext
    {
        public MyDb() :base("test")
        {

        }
        public DbSet<A> a { get; set; }
        public DbSet<B> b { get; set; }
    }

    public class A
    {
        public int Id { get; set; }
        public string aname { get; set; }

        public virtual List<B> bList { get; set; }
    }

    public class B
    {
        public int Id { get; set; }

        public string bname { get; set; }

        public int? AId { get; set; }

        [ForeignKey("AId")]
        public virtual A a { get; set; }
    }
public partial class init : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.A",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        aname = c.String(),
                    })
                .PrimaryKey(t => t.Id);
            
            CreateTable(
                "dbo.B",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        bname = c.String(),
                        AId = c.Int(),
                    })
                .PrimaryKey(t => t.Id)
                .ForeignKey("dbo.A", t => t.AId)
                .Index(t => t.AId);
            
        }
        
        public override void Down()
        {
            DropForeignKey("dbo.B", "AId", "dbo.A");
            DropIndex("dbo.B", new[] { "AId" });
            DropTable("dbo.B");
            DropTable("dbo.A");
        }
    }

看这一行:AId = c.Int(),

czd890 | 园豆:14488 (专家六级) | 2016-11-11 16:15

@calvinK: 你设置了ForeignKey了么

如果没设置 让EF自己找的话 生成的就可以为空 但是如果设置了外键生成的就不可为空了

15904915314 | 园豆:215 (菜鸟二级) | 2016-11-11 16:16

@calvinK: ABP框架集成的EF

15904915314 | 园豆:215 (菜鸟二级) | 2016-11-11 16:16

@面惧超人: 

czd890 | 园豆:14488 (专家六级) | 2016-11-11 16:18

@面惧超人: 

[ForeignKey("AId")] 代码都贴上来了

czd890 | 园豆:14488 (专家六级) | 2016-11-11 16:19

@calvinK: 我去试试

15904915314 | 园豆:215 (菜鸟二级) | 2016-11-11 16:21

@calvinK: 

Abp.Zero.EntityFramework   100.0.2.3

Abp.EntityFramework 100.0.2.3

EntityFramework 6.0.0.0

暂时用ABP的里面有三个。。 我再试试最新的去吧

15904915314 | 园豆:215 (菜鸟二级) | 2016-11-11 16:41

@calvinK: 这个例子确实好用 可能还是写法有问题 再去测试下 已经有了方向了

15904915314 | 园豆:215 (菜鸟二级) | 2016-11-11 17:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册