唯一索引属性上的实体框架FK

时间:2016-08-18 11:19:31

标签: c# sql-server entity-framework

我想在第二个表中的unique not null属性上添加外键。这是它的样子:

 public class T_AlarmTresholds
    {
        [Key]
        public int Id { get; set; }
              ....
              ....                
        public Guid MeasurementGuid { get; set; }

        [ForeignKey("MeasurementGuid")]
        public virtual T_Measurements Measurement { get; set; }
    }


 public partial class T_Measurements
    {
        public int Id { get; set; }
        [Index("UC_Guid", IsUnique = true)]
        public Guid GUID { get; set; }
    }

这是模型构建器:

modelBuilder.Entity<T_Measurements>()
                .HasMany(x => x.T_AlarmTresholds)
                .WithRequired(x => x.Measurement)
                .HasForeignKey(x => x.MeasurementGuid);

实体框架在SQL Server接受此解决方案时抛出错误。调试时Visual Studio中出现错误:

  

{&#34;在模型中检测到一个或多个验证错误   代:\ r \ n \ r \ nT_Measurements_T_AlarmTresholds_Source_T_Measurements_T_AlarmTresholds_Target:   :参照的从属角色中的所有属性的类型   约束必须与相应的属性类型相同   主要角色。物业的类型&#39; MeasurementGuid&#39;在实体上   &#39; T_AlarmTresholds&#39;不符合财产的类型&#39; ID&#39;在实体上   &#39; T_Measurements&#39;在引用约束中   &#39; T_Measurements_T_AlarmTresholds&#39; \ r \ n&#34;}

1 个答案:

答案 0 :(得分:0)

您不需要在虚拟对象上放置外键,而是需要在T_AlarmTresholds中创建新属性:

public int T_MeasurementsId{get; set;}

充当外键。依赖属性(虚拟属性)将自动链接。您还需要从虚拟属性中删除ForiegnKey属性。

<小时/> 修改: 刚发现您的代码不使用Id列作为主键,而是使用Guid,因此您需要将外键属性添加到MeasurementGuid属性。