实体
[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就这么设置的还是说有接口可以配置呀
没看出来有问题,你是1对多呀,多的这个表里面关系id当然不能可空的呀。不然一对多关系都没有了。
这概念到是不太清楚 1对多的情况不能1对0么。。。。 现在确实有这个需求 从oracle导到mssql上 元表就是可以为空的列
AlterColumn("dbo.T_FCD008", "JUCHU_ID", c => c.Decimal(nullable: false, precision: 38, scale: 0, storeType: "numeric"));
nullable: false, 我可以把这个注释掉实现 但是感觉不是解决的办法。。
@面惧超人: 一对多里面,多可以是0个,但是多个里面的1不能是null呀,是不
@calvinK: 1没有空呀 1的key是主key 多的key才是ForeignKey
/// <summary>
/// JUCHU_ID
/// </summary>
[Column("JUCHU_ID", TypeName = "numeric")]
public virtual decimal? juchuId { get; set; } 这里这个是外键
//一
class A{
list<B> b{get;set;}
}
//多
class B{
int aId{}
A a{get;set;}
}
你说B表里面的aid字段能为null么,如果他为null,那一对多关系还存在么。主外键约束也不成立呀,是不
@calvinK: 就你举的这个例子 1对0 的情况是什么样子呢 不就是B表里的a为空么
难道是B表里的a是A表里没有的数据么,这样就违反了外键约束了
@面惧超人: 1对0.是B表没有数据,不是aid字段为null。
@calvinK: 那也就是说在orm中 外键是不可以为空的了吗
@面惧超人: 不光是orm,数据库也是一样的。
@calvinK: 数据库是可以的...oracle mssql mysql都可以 postgre没试过
@calvinK: 而且就code frist 在migrations里 直接删掉nullable: false生成的数据库就是可以为空的 但是在生成migrations的时候 无论如何设置都会被加上nullable: false
@面惧超人:
我刚才测试了一下。没有你这个问题。自动迁移可以设置为null。是否是你ef版本的问题
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(),
@calvinK: 你设置了ForeignKey了么
如果没设置 让EF自己找的话 生成的就可以为空 但是如果设置了外键生成的就不可为空了
@calvinK: ABP框架集成的EF
@面惧超人:
@面惧超人:
[ForeignKey("AId")] 代码都贴上来了
@calvinK: 我去试试
@calvinK:
Abp.Zero.EntityFramework 100.0.2.3
Abp.EntityFramework 100.0.2.3
EntityFramework 6.0.0.0
暂时用ABP的里面有三个。。 我再试试最新的去吧
@calvinK: 这个例子确实好用 可能还是写法有问题 再去测试下 已经有了方向了