[英]EF code first - configure One-to-Zero-or-One relationship without shared PK/FK
[英]EF6 code first one to zero or one with Predefined FK property
正在处理一些旧代码,将向数据库中添加新表,并且将具有两个一对零或一个关系,因此我需要“出于某种原因”将新表中的ForeignKey定义为属性和代码:
public class EconomyInfo : Entity
{
/*other props*/
[ForeignKey("LogoImage")]
[Required]
public int LogoImage_Id { get; set; }
public virtual Image LogoImage { get; set; }
[ForeignKey("Organization")]
[Required]
public int Organization_Id { get; set; }
public virtual Organization Organization { get; set; }
}
public class Image : Entity
{
/*other props*/
public virtual EconomyInfo Economyinfo { get; set; }
}
public class Organization : Entity
{
/*other props*/
public virtual EconomyInfo EconomyInfo { get; set; }
}
public class Entity
{
public int Id { get; set; }
}
像这样的EF不会产生迁移并给出错误
EconomyInfo_LogoImage_Source::多重性在关系“ EconomyInfo_LogoImage”中的角色“ EconomyInfo_LogoImage_Source”中无效。 因为从属角色属性不是关键属性,所以从属角色多重性的上限必须为'*'。
和其他导航属性相同,如果我将它们添加到上下文类的行中:
modelBuilder.Entity<Organization>().HasOptional(o => o.EconomyInfo).WithOptionalPrincipal();
modelBuilder.Entity<Image>().HasOptional(i => i.Economyinfo).WithOptionalPrincipal();
迁移将生成而没有错误,但它会很奇怪,例如:
public override void Up()
{
CreateTable(
"dbo.EconomyInfoes",
c => new
{
Id = c.Int(nullable: false, identity: true),
LogoImage_Id = c.Int(nullable: false),
Organization_Id = c.Int(nullable: false),
Image_Id = c.Int(),
Organization_Id1 = c.Int(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Images", t => t.LogoImage_Id, cascadeDelete: true)
.ForeignKey("dbo.Organizations", t => t.Organization_Id)
.ForeignKey("dbo.Images", t => t.Image_Id)
.ForeignKey("dbo.Organizations", t => t.Organization_Id1)
.Index(t => t.LogoImage_Id)
.Index(t => t.Organization_Id)
.Index(t => t.Image_Id)
.Index(t => t.Organization_Id1);
}
我知道我可以编辑生成的EF迁移代码以使其指定我的需求,但是没有必要浪费很多时间来处理EF,然后放弃并解决它,而且使用它并不是那么实际后来我的同事们,提前感谢
我刚刚放弃,决定继续工作,为新实体编写自己的迁移,并告诉上下文在即将生成的迁移中忽略它。
所以我的解决方案是这样的:
在上下文类中:
// Regarding unPossible configuration to make pre defined property as foreign key in one to zero or one relationship
// we wrote our migration and tell the context to ignore our model and its navigation property from other model classes
modelBuilder.Entity<Organization>().Ignore(o => o.EconomyInfo);
modelBuilder.Entity<Image>().Ignore(i => i.Economyinfo);
modelBuilder.Ignore<EconomyInfo>();
组织类别:
public virtual EconomyInfo EconomyInfo { get; set; }
图片类别:
public virtual EconomyInfo Economyinfo { get; set; }
手动书面迁移:
using System;
using System.Data.Entity.Migrations;
public partial class EconomyInfo : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.EconomyInfoes",
c => new
{
Id = c.Int(nullable: false, identity: true),
LogoImage_Id = c.Int(nullable: false),
Organization_Id = c.Int(nullable: false),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Images", t => t.LogoImage_Id)
.ForeignKey("dbo.Organizations", t => t.Organization_Id)
.Index(t => t.LogoImage_Id)
.Index(t => t.Organization_Id);
}
public override void Down()
{
DropForeignKey("dbo.EconomyInfoes", "Organization_Id", "dbo.Organizations");
DropForeignKey("dbo.EconomyInfoes", "LogoImage_Id", "dbo.Images");
DropIndex("dbo.EconomyInfoes", new[] { "Organization_Id" });
DropIndex("dbo.EconomyInfoes", new[] { "LogoImage_Id" });
DropTable("dbo.EconomyInfoes");
}
}
您也可以参考此问题以获取更多信息。 如何以一对一/零关系指定外键?
注意:我将书面迁移应用于数据库工作正常,尝试生成新迁移,也按预期工作,但尚未通过代码与我的新模型类一起进行测试。 希望以后不会有任何混乱,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.