Использование Entity Framework для определения ссылочного ограничения [duplicate]

Это затронет только небольшую часть пользователей, но я бы хотел, чтобы это было документировано для этой небольшой части. Из-за этой проблемы этот член этой маленькой горстки потратил 6 часов на устранение неполадок с работающим PHP-почтовым скриптом.

Если вы собираетесь в университет, в котором работает XAMPP с сайта www.AceITLab.com, вы должны знать, что наш профессор не сказал нам: брандмауэр AceITLab (а не брандмауэр Windows) блокирует MercuryMail в XAMPP , Вам придется использовать альтернативный почтовый клиент, груша работает на нас. Вам нужно будет отправить учетную запись Gmail с низкими настройками безопасности.

Да, я знаю, это абсолютно бесполезно для электронной почты реального мира. Однако, из того, что я видел, академические настройки и реальный мир часто имеют очень мало общего.

62
задан abatishchev 31 March 2016 в 17:39
поделиться

2 ответа

Вы можете использовать либо свободный API:

public class Category
{
    public int CategoryId1 { get; set; }
    public int CategoryId2 { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public int CategoryId1 { get; set; }
    public int CategoryId2 { get; set; }

    public virtual Category Category { get; set; }
}

public class Context : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Category>()
            .HasKey(c => new {c.CategoryId1, c.CategoryId2});

        modelBuilder.Entity<Product>()
            .HasRequired(p => p.Category)
            .WithMany(c => c.Products)
            .HasForeignKey(p => new {p.CategoryId1, p.CategoryId2});

    }
}

, либо аннотации данных:

public class Category
{
    [Key, Column(Order = 0)]
    public int CategoryId2 { get; set; }
    [Key, Column(Order = 1)]
    public int CategoryId3 { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

public class Product
{
    [Key]
    public int ProductId { get; set; }
    public string Name { get; set; }
    [ForeignKey("Category"), Column(Order = 0)]
    public int CategoryId2 { get; set; }
    [ForeignKey("Category"), Column(Order = 1)]
    public int CategoryId3 { get; set; }

    public virtual Category Category { get; set; }
}
123
ответ дан Ladislav Mrnka 20 August 2018 в 15:07
поделиться
  • 1
    Нужно ли сохранять виртуальные свойства (общедоступная виртуальная категория категорий {get; set;}), а также аннотации данных? – DotnetSparrow 26 March 2011 в 17:24
  • 2
    virtual свойства навигации необходимы для ленивой загрузки. virtual по скалярным свойствам помогает отслеживать изменения прикрепленных объектов. – Ladislav Mrnka 26 March 2011 в 17:27
  • 3
    Что бы вы сделали, если имена столбцов таблицы внешнего ключа были отличны от того, что находится в родительском? Например, в продукте, как бы вы пометили атрибут ForeignKey, если бы имена столбцов выглядели следующим образом: PCategoryId2, PCategoryId3? – user 29 February 2012 в 23:13
  • 4
    Что касается этой строки: .HasRequired(p => p.Category), но Product не обладает свойством Entity Catagory, а двумя идентификаторами, которые образуют составной ключ категории. Не могли бы вы объяснить, потому что я считаю, что он даже не компилируется ... Спасибо! – gdoron 29 August 2012 в 12:56
  • 5
    @gdoron: Product имеет Category в моем ответе. – Ladislav Mrnka 29 August 2012 в 13:26

Я считаю, что самый простой способ - использовать Data Annotation для свойства Navigation следующим образом: [ForeignKey("CategoryId1, CategoryId2")]

public class Category
{
    [Key, Column(Order = 0)]
    public int CategoryId1 { get; set; }
    [Key, Column(Order = 1)]
    public int CategoryId2 { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

public class Product
{
    [Key]
    public int ProductId { get; set; }
    public string Name { get; set; }
    public int CategoryId1 { get; set; }
    public int CategoryId2 { get; set; }

    [ForeignKey("CategoryId1, CategoryId2")]
    public virtual Category Category { get; set; }
}
13
ответ дан Christophe 20 August 2018 в 15:07
поделиться
  • 1
    Это отлично поработало. Я тоже предпочитаю использовать это в свойствах Navigation. Однако, как я могу установить cascadeDelete: false только для этого свойства, а не для всего сайта? благодаря – RoLYroLLs 21 March 2018 в 22:00
  • 2
    В некоторых случаях внешний ключ также является частью составного ключа текущей таблицы. Так работал. Другой способ (@Ladislov) этого не сделал. Я получил ошибку: & quot; Дублировать атрибут столбца & quot; – D. Kermott 21 June 2018 в 13:53
  • 3
    RoLYroLLs: cascadeDelete устанавливается в файле миграции (после использования команды менеджера пакетов добавления-переноса). Пример: AddForeignKey ("dbo.Product", "GuidedActivityID", "dbo.GuidedActivity", "ID", cascadeDelete: false); – Christophe 18 August 2018 в 22:35
Другие вопросы по тегам:

Похожие вопросы: