Конфигурация One-One HasRequired не работает - PullRequest
1 голос
/ 05 марта 2020

У меня есть два набора объектов: Coupon и DiscountScheme.
Каждый имеет подключенный объект {Type}Action и идентичные конфигурации.
При отправке запроса на Coupon я не делаю получить что-нибудь обратно, но тот же запрос для DiscountScheme работает как положено

Сокращенная версия классов (полный код и sql для таблиц можно найти здесь ):

public class CouponAction
{
    public int Id { get; set; }
    public virtual Coupon Coupon { get; set; }
}

public class Coupon
{
    public int Id { get; set; }
    public virtual CouponAction Action { get; set; }
}

public class DiscountSchemeAction
{
    public int Id { get; set; }
    public virtual DiscountScheme DiscountScheme { get; set; }
}

public class DiscountScheme
{
    public int Id { get; set; }
    public virtual DiscountSchemeAction Action { get; set; }
}

Конфигурация:

public class CouponActionMap : EntityTypeConfiguration<CouponAction>
{
    public CouponActionMap()
    {
        ToTable("CouponAction");
    }
}

public class CouponMap : EntityTypeConfiguration<Coupon>
{
    public CouponMap()
    {
        ToTable("Coupon");
        HasRequired(c => c.Action);
    }
}

public class DiscountSchemeActionMap : EntityTypeConfiguration<DiscountSchemeAction>
{
    public DiscountSchemeActionMap()
    {
        ToTable("DiscountSchemeAction");
    }
}

public class DiscountSchemeMap : EntityTypeConfiguration<DiscountScheme>
{
    public DiscountSchemeMap()
    {
        ToTable("DiscountScheme");

        HasRequired(ds => ds.Action);
    }
}

Запрос, который я пытаюсь сделать:

using(var context = new Context()/* My database context, using a custom wrapper framework*/)
{
  Console.WriteLine(context.Coupons.ToList()); // nothing
  Console.WriteLine(context.DiscountSchemes.ToList()); // the contents of the table
}

Если я запрашиваю таблицу действий, я получаю содержимое , но опять же для CouponAction я не получаю подключенный Coupon, а для DiscountScheme он работает как положено.

1 Ответ

2 голосов
/ 06 марта 2020

Проблема связана с вашими отношениями 1: 1. По умолчанию EF ожидает, что 1 к 1 будет использовать PK в обеих таблицах. Поместив CouponID в свой CouponAction, вы не устанавливаете отношение 1 к 1, вы устанавливаете отношение 1 к многим / многие к 1. Ничто не мешает нескольким записям CouponAction иметь один и тот же CouponId. Вы можете наложить уникальное ограничение на CouponID, но если бы это было так, то вы также можете использовать PK CouponAction в качестве CouponID. Следовательно, именно поэтому я не советую использовать «Id» в качестве имени PK, а скорее CouponId против DiscountId и т. Д. c.

Если связь между купоном и действием действительно однозначна 1, затем избавьтесь от CouponId в таблице действий и убедитесь, что вы используете одно и то же значение идентификатора в обеих таблицах для связанных записей. Вы можете проверить это, изменив сопоставление, чтобы настроить EF для использования CouponId в CouponAction, так как это PK. После того, как вы это сделаете, вы должны увидеть соответствующие записи.

В качестве альтернативы вы можете установить sh отношение многие к 1 (HasOne.WithMany ()) от действия к купону, но без обратной ссылки без CouponActionId on Coupon. Или вы можете установить 1-ко-многим, где Купон содержит ICollection<CouponAction> CouponActions, даже если вы намерены выполнять только одно действие на купон. Но если это 1 к 1, я настоятельно рекомендую использовать одинаковое значение PK для обеих таблиц.

...