Как настроить несколько ссылок Foreignkey на одну и ту же таблицу из основной таблицы с помощью EF Code First Fluient API - PullRequest
2 голосов
/ 12 июля 2011

Мне нужно спроектировать веб-приложение, используя существующую базу данных настольного приложения. В соответствии с существующей базой данных у меня ниже класса

public class Company
{

    #region Primitive Properties

    public virtual int CompanyID { get; set; }
    public virtual string CompanyName { get; set; }

    public virtual bool IsCustomer { get; set; }
    public virtual string CustomerCode { get; set; }
    public virtual bool IsPotentialCustomer { get; set; }

    public virtual bool IsSupplier { get; set; }
    public virtual string SupplierCode { get; set; }
    public virtual bool IsPotentialSupplier { get; set; }

    public CompanyCategoryCodes CustomerCategoryCode { get; set; }
    public CompanyCategoryCodes SupplierCategoryCode { get; set; }
    public CountryCode CountryCode { get; set; }

}

public class CompanyCategoryCodes
{
    public virtual int CategoryID { get; set; }
    public virtual string CategoryCodes { get; set; }
    public virtual bool PotentialCustomer { get; set; }
    public virtual bool PotentialSupplier { get; set; }
    public virtual System.DateTime LastModifiedDate { get; set; }
    public virtual bool Manufacturer { get; set; }
}

public class CountryCode
{
    public virtual int CountryCodeID  { get; set; }
    public virtual string Code { get; set; }
    public virtual string Description  { get; set; }
    public virtual bool DefaultCode { get; set; }
    public virtual bool EECVATApplies { get; set; }
    public virtual System.DateTime LastModifiedDate { get; set; }
    public virtual bool FixedAddressFormat { get; set; }
}

EF Code первой структурой по умолчанию является создание Foreignkey с именем "CustomerCategoryCode_CategoryID", "SupplierCategoryCode_CategoryID", "CountryCode_CountryCodeID". Я хочу, чтобы это имя Foreignkey совпадало с моими старыми таблицами базы данных, например "CustomerCategoryCodeID", "SupplierCategoryCodeID", "CountryCodeID". Как я могу сделать это, используя EF Code First Fluient API. Я пытаюсь сделать это с помощью Fluient API Mapping, но я получил ошибку для «SupplierCategoryCode_CategoryCodeID», так как «CustomerCategoryCode_CategoryID» также находится в той же таблице «CompanyCategoryCode». Также, если есть какая-либо опция, доступная с использованием аннотации данных, дайте мне знать, как этого добиться.

Ответы [ 2 ]

1 голос
/ 12 июля 2011

Вы должны вручную переназначить каждое свойство навигации, чтобы определить его ключ. Что-то вроде:

modelBuilder.Entity<Company>()
            .HasRequired(c => c.CountryCode)
            .WithMany()
            .HasForeignKey("CountryCodeID");

modelBuilder.Entity<Company>()
            .HasMany(c => c.CustomerCategoryCode)
            .WithOptional()
            .HasForeignKey("CustomerCategoryCodeID")
            .WillCascadeOnDelete(false);

modelBuilder.Entity<Company>()
            .HasMany(c => c.SupplierCategoryCode)
            .WithOptional()
            .HasForeignKey("SupplierCategoryCodeID")
            .WillCascadeOnDelete(false); 

Это невозможно с аннотациями данных, если вы не определите свойство навигации и свойство внешнего ключа в каждой зависимой сущности, например:

public class Company
{
    ...

    [ForeignKey("CountryCode")]
    public virtual int CountryCodeID { get; set; }
    public CountryCode CountryCode { get; set; }
}
0 голосов
/ 12 июля 2011

Внутри вашего контекстного класса вам нужно переопределить OnModelCreating и сопоставить ключи, это должно выглядеть примерно так:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
             modelBuilder.Entity<Company>()
                .HasRequired(c => c.CustomerCategoryCode)
                .WithMany() 
                .Map(mc => mc.MapKey("CustomerCategoryCodeID"));
}
...