Код EF6 сначала один к нулю или один с предопределенным свойством FK - PullRequest
0 голосов
/ 02 ноября 2018

я работаю над устаревшим кодом, добавлю новую таблицу в БД и он будет иметь два отношения «один к нулю» или «один», и мне нужно «по какой-то причине» ForeignKeys в новой таблице, которые будут определены как свойства и код:

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; }
    }

Like This EF не генерирует миграцию и выдает ошибку

EconomyInfo_LogoImage_Source:: множественность недопустима в роли EconomyInfo_LogoImage_Source во взаимосвязи EconomyInfo_LogoImage. Поскольку свойства зависимой роли не являются ключевыми свойствами, верхняя граница кратности зависимой роли должна быть «*».

и то же самое для другого свойства навигации и если я добавлю их в строки в классе контекста:

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, а затем сдаться и обойти его, плюс это не будет так практично поработайте с ним позже мои коллеги, заранее спасибо

1 Ответ

0 голосов
/ 05 ноября 2018

Я только что сдался и решил пойти вокруг, написать свою собственную миграцию для моей новой сущности и сказать контексту игнорировать ее из предстоящей сгенерированной миграции.

Итак, мое решение таково:

В контексте класса:

// 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");
        }
    }

Вы можете обратиться к этому вопросу также для получения дополнительной информации Как указать внешний ключ в отношении один к одному / нулю?

Примечание: я применил свою письменную миграцию к базе данных, работает нормально, попытался сгенерировать новую миграцию, также работает как положено, но еще не тестировал работу с моим новым классом модели из кода. Надеюсь, позже ничего не будет испорчено,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...