Я не хочу родительской сущности или внешнего ключа для сущности внука - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть три объекта, BaseEntity, Child и GrandChild, которые предсказуемо связаны друг с другом.

Это выглядит так:

    public class BaseEntity
    {
        public string CompanyId { get; set; }

        public string BaseEntityId { get; set; }

        public virtual List<Child> Children { get; set; }
    }

    public class Child
    {
        public string CompanyId { get; set; }

        public string BaseEntityId { get; set; }

        public string ChildId { get; set; }

        public virtual BaseEntity Parent { get; set; }

        public virtual List<GrandChild> GrandChildren { get; set; }
    }

    public class GrandChild
    {
        public string CompanyId { get; set; }

        public string BaseEntityId { get; set; }

        public string ChildId { get; set; }

        public string GrandChildId { get; set; }

        public virtual Child ParentChild { get; set; }
    }

    public class BaseContext : DbContext
    {
        protected override void OnModelCreating(ModelBuilder p_mbuModel)
        {
            p_mbuModel.Entity<BaseEntity>().ToTable("T_BaseEntity");

            p_mbuModel.Entity<BaseEntity>().HasKey(t => new { t.CompanyId, t.BaseEntityId });

            p_mbuModel.Entity<Child>().ToTable("T_Child");

            p_mbuModel.Entity<Child>().HasKey(t => new { t.CompanyId, t.BaseEntityId, t.ChildId });

            p_mbuModel.Entity<Child>().HasOne(c => c.Parent).
                                       WithMany(p => p.Children).
                                       HasForeignKey(c => new { c.CompanyId, c.BaseEntityId }).
                                       HasConstraintName("FK_Child_BaseEntity");

            p_mbuModel.Entity<GrandChild>().ToTable("T_GrandChild");

            p_mbuModel.Entity<GrandChild>().HasKey(t => new { t.CompanyId, t.BaseEntityId, t.ChildId, t.GrandChildId });

            p_mbuModel.Entity<GrandChild>().HasOne(gc => gc.ParentChild).
                                            WithMany(c => c.GrandChildren).
                                            HasForeignKey(gc => new { gc.CompanyId, gc.BaseEntityId, gc.ChildId }).
                                            HasConstraintName("FK_GrandChild_Child");
        }
    }

Вы заметите, что в нем нет прямой ссылки от GrandChild до BaseEntity и нет внешнего ключа между GrandChild и BaseEntity,Что соответствует.Я не хочу эту прямую ссылку.(Если ничего другого, это может привести к неприятностям с каскадным удалением.)

Тем не менее, когда я запускаю Add-Migration, я получаю следующее:

    table.ForeignKey(
        name: "FK_T_GrandChild_T_BaseEntity_BaseEntityId",
                        columns: x => { x.CompanyId, x.BaseEntityId },
                        principalTable: "T_BaseEntity",
                        principalColumns: new { "CompanyId", "BaseEntityId" },
                        onDelete: ReferentialAction.Cascade);

То, что у меня естьпытался не пускать.(При переносе создается ограничение внешнего ключа, которое мне не нужно, и с этим громоздким именем для загрузки.)

Я попытался добавить

    p_mbuModel.Entity<GrandChild>().Ignore(t => new { t.CompanyId, t.BaseEntityId });

, что вызывает исключение длямелодия

The expression 't => new <>f__AnonymousType10`2(CompanyId = t.CompanyId, BaseEntityId = t.BaseEntityId)' is not a valid property expression. The expression should represent a simple property access: 't => t.MyProperty'.

(я полагаю, этого следовало ожидать; это был длинный выстрел для меня.)

Я мог бы добавить свойство GrandParent к GrandChild и использоватьIgnore(), но для этого потребуется создать ту самую ссылку, которую я хочу скрыть.

Мне не нужна связь между BaseEntity и GrandChild, ни в качестве сущностей, ни в качестве таблиц базы данных.

Как мне этого добиться?

1 Ответ

0 голосов
/ 05 апреля 2019

... Мне стыдно признаться в этом.Когда я отправил вопрос, я обрезал нерелевантные части моих занятий.И я не заметил, что BaseEntity включает эту строку:

        public virtual List<GrandChild> GrandChildren { get; set; }

Я удалил ее и снова запустил Add-Migration.Не найдено ссылок между BaseEntity и GrandChild.

Извинения всем, кто пытался разобраться в этой незавершенной загадке.

...