实体框架如何在数据库优先的方法中确定主键

本文关键字:方法 框架 数据库 实体 | 更新日期: 2023-09-27 18:04:54

我有以下三个模型类在我的sql server 2008,我使用ado.net实体框架映射表:-

数据库中ITSwitchPort表的主键是TechnologyID &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; }
    }

数据库中Technology表的主键是:

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。

答案是,一旦你首先使用数据库,实体框架会自动添加实体和表之间的映射,其中一个映射如下:

this.HasKey(a => a.TechnologyID );

中的技术映射类。(自动生成)

通过这段代码,entity - framework知道哪个属性是主键。