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