我已经尝试了StackOverflow的几乎所有方法来防止这些错误。我不知道我在做什么错。当我开始进行一些更改以删除一个错误时,第二个错误出现,反之亦然。我不知道它是否连接到数据库,还是可以初始化数据库,还是不能。看来我的数据库文件为空-我正在使用SQLite,并且我想使用EF的Code First机制。

我的密码

using System.Data.Entity;
using ControlCenter;

namespace ControlCenter
{
    public class IncomingMessaggesContext: DbContext
    {
        public DbSet<UnifiedPositionMessage> UnifiedPositionMessages { get; set; }
        public DbSet<MessageDescription> MessageDescriptions { get; set; }

        static IncomingMessaggesContext()
        {
            Database.SetInitializer<IncomingMessaggesContext>(null);
        }
    }
}


using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace ControlCenter.CommunicationGateway
{
    using System;
    using TrackingDevices.Positioning;

     public class UnifiedPositionMessage
     {

         public int Id { get; set; }

         public uint DeviceID { get; set; }
         public DateTime ReceiveTime { get; set; }
         public PositionBase DevicePosition { get; set; }
         public object UserPayload { get; set; }

         public int MessageDescriptionId { get; set; }

        [ForeignKey("Id")]
        [Required]
        public virtual MessageDescription MessageDescription { get; set; }

     }

     public class MessageDescription
     {
         public int Id { get; set; }
         public bool IsMessageValid { get; set; }

         public virtual UnifiedPositionMessage UnifiedPositionMessage { get; set; }
     }
}


呼叫数据库

using (var db = new IncomingMessaggesContext()  )
{
    var msgDesc = new MessageDescription() {IsMessageValid = true, Id = 0, UnifiedPositionMessage = e.Frame};
    db.MessageDescriptions.Add(msgDesc);
    db.UnifiedPositionMessages.Add(e.Frame);
    db.SaveChanges();
}


和连接设置

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <connectionStrings>
      <add name="IncomingMessaggesContext"
       connectionString="Data Source=c:\temp\Messages.db;"
       providerName="System.Data.SQLite" />
    </connectionStrings>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <add name="SQLite Data Provider"
            invariant="System.Data.SQLite"
            description="Data Provider for SQLite"
            type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    </DbProviderFactories>
  </system.data>
</configuration>

最佳答案

您在此处定义1(MessageDescription):0..1 (UnifiedPositionMessage关联。

EF想要做的是在一个表中定义一个主键,而该主键同时又是另一个表的外键。在您的情况下,UnifiedPositionMessage将具有一个非自动递增的ID字段,该字段指向MessageDescription.Id,这是一个自动递增的标识列。因此,任何UnifiedPositionMessage记录只能在其MessageDescription存在的情况下存在。这由[Required]属性强制执行。

在这种情况下,在您的实体中没有显式的外键字段是没有用的:只有一个FK也是PK,因此您将永远无法进行设置。

因此,您可以从模型中删除MessageDescriptionId,然后告诉EF如何映射实体:

modelBuilder.Entity<UnifiedPositionMessage>()
            .HasRequired(u => u.MessageDescription)
            .WithOptional(md => md.UnifiedPositionMessage);


(这在DbContext.OnModelCreating替代中)

关于c# - 无法确定OR的主体结尾“值不能为空,参数名称为'key'”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19419923/

10-10 05:08