R D*_*R D 5 c# entity-framework-core
首先抱歉,这是一个菜鸟问题。
\n\n我正在尝试编写连接到现有数据库并根据用户输入更改某些值的 ac# 程序。(我知道这听起来像是一个坏主意,但我们有我们的理由\xe2\x80\xa6)我决定使用 ef core 连接到数据库。
\n\n我曾经Scaffold-DbContext将数据库结构放入我的程序中。\n构建成功,但是每当我尝试运行我的程序时,我都会收到以下错误消息:
\n\n\nSystem.InvalidOperationException: \'无法确定\'Dad.DadCmu\'和\'DadCmu.IddadNavigation\'之间的一对一关系的子/从属方。要识别关系的子方/从属方,请配置外键属性。如果这些导航不应该是同一关系的一部分,则配置它们而不指定相反关系。有关更多详细信息,请参阅http://go.microsoft.com/fwlink/ ?LinkId=724062。\'
\n
所以我猜这种关系没有明确定义。让我们看看这些类:
\n\n public partial class DadCmu\n {\n public int Iddad { get; set; }\n public byte UnitNo { get; set; }\n\n public virtual Dad IddadNavigation { get; set; }\n }\nRun Code Online (Sandbox Code Playgroud)\n\n所以 IddadNavigation 是 Dad 类型:
\n\npublic partial class Dad\n {\n public Dad()\n {\n DadCh = new HashSet<DadCh>();\n DadConnection = new HashSet<DadConnection>();\n }\n\n public int Iddad { get; set; }\n public string Name { get; set; }\n public int? DadType { get; set; }\n public short? Active { get; set; }\n public DateTime? LastUpdate { get; set; }\n public byte? SynchronizationStatus { get; set; }\n\n public virtual DadCmu DadCmu { get; set; }\n public virtual DadMasCon DadMasCon { get; set; }\n public virtual DadOpc DadOpc { get; set; }\n public virtual ICollection<DadCh> DadCh { get; set; }\n public virtual ICollection<DadConnection> DadConnection { get; set; }\n }\nRun Code Online (Sandbox Code Playgroud)\n\n他们的关系应该定义在OnModelCreating:
protected override void OnModelCreating(ModelBuilder modelBuilder)\n {\n \xe2\x80\xa6\n modelBuilder.Entity<DadCmu>(entity =>\n {\n entity.HasKey(e => e.Iddad);\n\n entity.ToTable("DadCMU");\n\n entity.Property(e => e.Iddad)\n .HasColumnName("IDDad")\n .ValueGeneratedNever();\n\n entity.HasOne(d => d.IddadNavigation)\n .WithOne(p => p.DadCmu)\n .HasForeignKey<DadCmu>(d => d.Iddad)\n .HasConstraintName("FK_DadCMU_Dad");\n });\n \xe2\x80\xa6\n modelBuilder.Entity<Dad>(entity =>\n {\n entity.HasKey(e => e.Iddad);\n\n entity.Property(e => e.Iddad).HasColumnName("IDDad");\n\n entity.Property(e => e.LastUpdate).HasColumnType("datetime");\n });\n \xe2\x80\xa6\n }\nRun Code Online (Sandbox Code Playgroud)\n\n所以这里modelBuilder.Entity<DadCmu>确实明确提到了一个外键,所以我不太确定问题是什么?\n我必须在 中做同样的事情吗modelBuilder.Entity<Dad>?
该代码会是什么样子?
\n\n或者我完全误解了这个问题?
\n\n这是可以自动完成的事情,例如使用参数 for 吗scaffold-dbcontext?(我的数据库有 180 个表,其中许多表都出现相同的错误。)
这一切都可以在不改变数据库本身结构的情况下实现吗?
\n\n提前非常感谢!再说一次,这是我第一次使用数据库,所以如果这真的很明显,我深表歉意。
\n\n编辑: \nDadOpc 类出现在评论中:
\n\n public partial class DadOpc\n {\n public int Iddad { get; set; }\n public string Computer { get; set; }\n public string OpcserviceName { get; set; }\n public float? ScanInterval { get; set; }\n public byte? ServerType { get; set; }\n public byte? UseSecurity { get; set; }\n\n public virtual Dad IddadNavigation { get; set; }\n }\nRun Code Online (Sandbox Code Playgroud)\n\n编辑2:(关于jcruz'解决方案)
\n\n错误信息:
\n\n\n\n\nSystem.InvalidOperationException: \'无法确定\'DadMasCon.IddadNavigation\'和\'Dad.DadMasCon\'之间的一对一关系的子/从属方。要识别关系的子方/从属方,请配置外键属性。如果这些导航不应该是同一关系的一部分,则配置它们而不指定相反关系。请参阅http://go.microsoft.com/fwlink/?LinkId=724062有关更多详细信息,
\n
班爸爸:
\n\npublic partial class Dad\n {\n public Dad()\n {\n DadCh = new HashSet<DadCh>();\n DadConnection = new HashSet<DadConnection>();\n }\n\n //user added Id-Fields:\n public int DadCmuId { get; set; }\n public int DadOpcId { get; set; }\n public int DadMasConId { get; set; }\n\n\n public int Iddad { get; set; }\n public string Name { get; set; }\n public int? DadType { get; set; }\n public short? Active { get; set; }\n public DateTime? LastUpdate { get; set; }\n public byte? SynchronizationStatus { get; set; }\n\n public virtual DadCmu DadCmu { get; set; }\n public virtual DadMasCon DadMasCon { get; set; }\n public virtual DadOpc DadOpc { get; set; }\n public virtual ICollection<DadCh> DadCh { get; set; }\n public virtual ICollection<DadConnection> DadConnection { get; set; }\n }\nRun Code Online (Sandbox Code Playgroud)\n\n爸爸马斯康班:
\n\n public DadMasCon()\n {\n DadModbusRegConfig = new HashSet<DadModbusRegConfig>();\n }\n\n public int Iddad { get; set; }\n public int UnitNo { get; set; }\n public byte? Model { get; set; }\n public DateTime? RefTimeOffset { get; set; }\n public float? TimeoutComm { get; set; }\n public int? Port { get; set; }\n public float? ConnectionInterval { get; set; }\n public byte? ExternalComm { get; set; }\n public string Mvbparameters { get; set; }\n public byte? ModbusBps { get; set; }\n public byte? ModbusParity { get; set; }\n public byte? ModbusStopBits { get; set; }\n public byte? ModbusMode { get; set; }\n public byte? ModbusSlaveAddress { get; set; }\n public byte? CardType0 { get; set; }\n public byte? CardType1 { get; set; }\n public byte? CardType2 { get; set; }\n public byte? CardType3 { get; set; }\n public string LastIp { get; set; }\n public string HiddenParameter { get; set; }\n public int? SerialNo { get; set; }\n public int? LastSequence { get; set; }\n public int? TcppackageErrors { get; set; }\n public byte? UsePrivateFirmware { get; set; }\n public byte? ConfigurationLock { get; set; }\n public byte? IecclientOn { get; set; }\n public string IecclientAddress { get; set; }\n public string IecclientDomain { get; set; }\n public byte? IecsrvOn { get; set; }\n public byte? IecsrvNrOfClents { get; set; }\n public string IecsrvAuthentication { get; set; }\n public string Iecmmsparam { get; set; }\n public float? IecclientPollInterval { get; set; }\n public byte? NtpserverType { get; set; }\n public string Ntpipaddress { get; set; }\n public string IecmmsparamFileName { get; set; }\n public string ModbusTcpaddress { get; set; }\n public int? ModbusTcpportNr { get; set; }\n public byte? ModbusByteOrder { get; set; }\n public byte? ModbusClientValueType { get; set; }\n public string Macaddress { get; set; }\n public byte? MonitorInitiate { get; set; }\n\n public virtual Dad IddadNavigation { get; set; }\n public virtual ICollection<DadModbusRegConfig> DadModbusRegConfig { get; set; }\n }\nRun Code Online (Sandbox Code Playgroud)\n\n模型创建时:
\n\nmodelBuilder.Entity<DadMasCon>(entity =>\n {\n entity.HasKey(e => e.Iddad)\n .HasName("PK_DadMasCon16");\n\n entity.Property(e => e.Iddad)\n .HasColumnName("IDDad")\n .ValueGeneratedNever();\n\n entity.Property(e => e.IecclientAddress).HasColumnName("IECClientAddress");\n\n entity.Property(e => e.IecclientDomain).HasColumnName("IECClientDomain");\n\n entity.Property(e => e.IecclientOn).HasColumnName("IECClientOn");\n\n entity.Property(e => e.IecclientPollInterval).HasColumnName("IECClientPollInterval");\n\n entity.Property(e => e.Iecmmsparam).HasColumnName("IECMMSParam");\n\n entity.Property(e => e.IecmmsparamFileName).HasColumnName("IECMMSParamFileName");\n\n entity.Property(e => e.IecsrvAuthentication).HasColumnName("IECSrvAuthentication");\n\n entity.Property(e => e.IecsrvNrOfClents).HasColumnName("IECSrvNrOfClents");\n\n entity.Property(e => e.IecsrvOn).HasColumnName("IECSrvOn");\n\n entity.Property(e => e.Macaddress).HasColumnName("MACAddress");\n\n entity.Property(e => e.ModbusTcpaddress)\n .HasColumnName("ModbusTCPAddress")\n .HasMaxLength(50);\n\n entity.Property(e => e.ModbusTcpportNr).HasColumnName("ModbusTCPPortNr");\n\n entity.Property(e => e.Mvbparameters).HasColumnName("MVBParameters");\n\n entity.Property(e => e.Ntpipaddress).HasColumnName("NTPIPAddress");\n\n entity.Property(e => e.NtpserverType).HasColumnName("NTPServerType");\n\n entity.Property(e => e.RefTimeOffset).HasColumnType("datetime");\n\n entity.Property(e => e.TcppackageErrors).HasColumnName("TCPPackageErrors");\n\n //user generated:\n entity.HasOne(d => d.IddadNavigation)\n .WithOne(p => p.DadMasCon)\n .HasForeignKey<Dad>(d => d.DadMasConId);\n\n //original:\n //entity.HasOne(d => d.IddadNavigation)\n // .WithOne(p => p.DadMasCon)\n // .HasForeignKey<DadMasCon>(d => d.Iddad)\n // .HasConstraintName("FK_DadMasCon_Dad");\n });\nRun Code Online (Sandbox Code Playgroud)\n
由于您尝试定义一对一关系,因此您需要在模型上显式定义反向引用 id,Dad以确保它映射到单个DadCmu记录。
public partial class Dad
{
public int DadCmuId { get; set; }
public virtual DadCmu DadCmu { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后您可以使用 Fluent API 进行配置,如下所示:
modelBuilder.Entity<DadCmu>(entity =>
{
entity.HasOne(d => d.IddadNavigation)
.WithOne(p => p.DadCmu)
.HasForeignKey<Dad>(d => d.DadCmuId);
});
Run Code Online (Sandbox Code Playgroud)
华泰
| 归档时间: |
|
| 查看次数: |
863 次 |
| 最近记录: |