У меня есть следующие три класса моделей внутри моего SQL Server 2008, и я сопоставил таблицы с использованием структуры сущностей ado.net:
Первичный ключ для таблицы ITSwitchPort внутри базы данных - это технологияIDID и SwitchID:
public partial class ITSwitchPort
{
public int TechnologyID { get; set; }
public int SwitchID { get; set; }
public string PortNumber { get; set; }
public virtual Technology Technology { get; set; }
public virtual ITSwitch ITSwitch { get; set; }
}
Первичным ключом для таблицы технологий в базе данных является технологияIDID:
public partial class Technology
{
public Technology()
{
this.ITServers = new HashSet<ITServer>();
this.ITSwitchPorts = new HashSet<ITSwitchPort>();
this.TechnologyAudits = new HashSet<TechnologyAudit>();
this.TechnologyIPs = new HashSet<TechnologyIP>();
}
public int TechnologyID { get; set; }
public string Tag { get; set; }
public bool IsDeleted { get; set; }
public byte[] timestamp { get; set; }
public Nullable<int> TypeID { get; set; }
public Nullable<System.DateTime> StartDate { get; set; }
public Nullable<long> IT360ID { get; set; }
public bool IsCompleted { get; set; }
public Nullable<long> PartialTag { get; set; }
public bool IsManaged { get; set; }
public virtual ICollection<ITSwitchPort> ITSwitchPorts { get; set; }
}
Первичным ключом для таблицы ITSwitch в базе данных является SwitchID:
public partial class ITSwitch
{
public ITSwitch()
{
this.ITSwitchPorts = new HashSet<ITSwitchPort>();
}
public int SwitchID { get; set; }
public Nullable<int> ModelID { get; set; }
public string Spec { get; set; }
public int RackID { get; set; }
public Nullable<int> ConsoleServerID { get; set; }
public string Description { get; set; }
public long IT360SiteID { get; set; }
public byte[] timestamp { get; set; }
public string ConsoleServerPort { get; set; }
public virtual SwitchModel SwitchModel { get; set; }
public virtual Technology Technology { get; set; }
public virtual ITRack ITRack { get; set; }
public virtual ICollection<ITSwitchPort> ITSwitchPorts { get; set; }
}
Теперь, если я попытаюсь обновить ITSwitchPort.SwitchID, я получу сообщение об ошибке, что SwitchID является частью ключа и не может быть обновлен, поэтому мой вопрос заключается в том, как структура сущности определяет, какой ключ для этих трех моделей?
Все, хотя ваша проблема решена, ваш вопрос остался без ответа.
Вопрос в том, как Entity-Framework знает, что свойство является таблицей Первичный ключ - DbFirst.
Ответ заключается в том, что, как только вы сначала используете базу данных, Entity-Framework автоматически добавляет сопоставление между вашими сущностями и вашими таблицами, а одно из них выглядит следующим образом:
this.HasKey(a => a.TechnologyID );
в классе отображения технологий. (который был сгенерирован автоматически)
С помощью этого кода Entity-Framwork знает, какое свойство является основным ключом.