1

我已经尝试了 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>
4

3 回答 3

1

您在此处定义 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覆盖)

于 2013-10-17T12:43:39.230 回答
0

那可能是因为Id不能为0!

var msgDesc = new MessageDescription() {IsMessageValid = true, Id = 0, UnifiedPositionMessage = e.Frame};

您可以将 msgDesc 设置为

var msgDesc = new MessageDescription {IsMessageValid = true, UnifiedPositionMessage = e.Frame};

因此,您在数据库中的记录都将具有唯一的 ID。

于 2013-10-17T06:46:28.080 回答
0

这不是结构!公共 PositionBase DevicePosition { 获取;放; }。根据以下规则更改它:

  public class PositionBase
  {
    public DateTime GPSTime { get; set; }
    public double Latitude { get; set; }
    public double Longitude { get; set; }
    public float Speed { get; set; }    // [km/h]
    public float Course { get; set; }   // [°]
}

public class PositionBase
{
    public int Id { get; set; }
    public DateTime GPSTime { get; set; }
    public double Latitude { get; set; }
    public double Longitude { get; set; }
    public float Speed { get; set; }    // [km/h]
    public float Course { get; set; }   // [°]

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

并将其添加到 DbContext 解决了这个问题。

public DbSet<PositionBase> PositionBases { get; set; }

第二个挑战是 EF 不支持对象类型,所以它也会导致问题!

于 2013-10-18T10:03:50.943 回答