繁体   English   中英

EF6代码从一到零,或者具有预定义的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM