Entity framework EF Core nullable一对一关系不允许重复NULL
在EF Core中,我有两个相互之间有1-1关系的模型 多层播放:Entity framework EF Core nullable一对一关系不允许重复NULL,entity-framework,foreign-keys,.net-core,Entity Framework,Foreign Keys,.net Core,在EF Core中,我有两个相互之间有1-1关系的模型 多层播放: public class MultiPlayerPlay { public long Id { get; set; } ... // Relations ... public long? CallerPlayerPlayId { get; set; } public virtual UserMutantPlay CallerPlayerPlay { get; set; }
public class MultiPlayerPlay
{
public long Id { get; set; }
...
// Relations
...
public long? CallerPlayerPlayId { get; set; }
public virtual UserMutantPlay CallerPlayerPlay { get; set; }
public long? CalledPlayerPlayId { get; set; }
public virtual UserMutantPlay CalledPlayerPlay { get; set; }
...
}
和UserMutantPlay:
public class UserMutantPlay
{
public long Id { get; set; }
...
// Relations
...
public long? MultiPlayerPlayAsCallerId { get; set; }
public virtual MultiPlayerPlay MultiPlayerPlayAsCaller { get; set; }
public long? MultiPlayerPlayAsCalledId { get; set; }
public virtual MultiPlayerPlay MultiPlayerPlayAsCalled { get; set; }
}
以及两者之间的关系:
modelBuilder.Entity<MultiPlayerPlay>()
.HasOne(mpp => mpp.CallerPlayerPlay)
.WithOne(p => p.MultiPlayerPlayAsCaller)
.HasForeignKey<MultiPlayerPlay>(mpp => mpp.CallerPlayerPlayId)
//.HasForeignKey<UserMutantPlay>(ump => ump.MultiPlayerPlayAsCallerId)
.IsRequired(false)
.OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);
modelBuilder.Entity<MultiPlayerPlay>()
.HasOne(mpp => mpp.CalledPlayerPlay)
.WithOne(p => p.MultiPlayerPlayAsCalled)
.HasForeignKey<MultiPlayerPlay>(mpp => mpp.CalledPlayerPlayId)
//.HasForeignKey<UserMutantPlay>(ump => ump.MultiPlayerPlayAsCalledId)
.IsRequired(false)
.OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);
第一次很好。接下来,它提到FK关系中不能有多个空值。错误是:
{System.Data.SqlClient.SqlException:无法在对象“dbo.MultiPlayerPlays”中插入具有唯一索引“IX_MultiPlayerPlays_CalledPlayerPlayId”的重复键行。重复的键值为()。
声明已终止。
位于System.Data.SqlClient.SqlConnection.OneError(SqlException异常、布尔断开连接、Action1 wrapCloseInAction)
位于System.Data.SqlClient.TdsParser.ThroweException和Warning(TdsParserStateObject StateObjectStateObj、布尔调用方连接锁、布尔异步关闭)
位于System.Data.SqlClient.TdsParser.TryRun(RunBehavior RunBehavior、SqlCommand cmdHandler、SqlDataReader dataStream、BulkCopySimpleResultSet bulkCopyHandler、TdsParserStateObject stateObj、Boolean和dataReady)
位于System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()处
在System.Data.SqlClient.SqlDataReader.get_MetaData()处
位于System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds、RunBehavior、String ResetOptions String)
位于System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior、RunBehavior RunBehavior、Boolean returnStream、Boolean async、Int32超时、任务和任务、Boolean asyncWrite、SqlDataReader ds)
位于System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior)
在Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection连接,String executeMethod,iRelationalOnlyDictionary
2参数值,布尔闭合连接)
位于Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection连接,IReadOnlyDictionary`2参数值)
在Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection)
客户连接ID:7c7adc7b-0172-4134-89c9-6b5f050ac860
错误号:2601,状态:1,类:14}
MultiPlayerPlay multiPlayerPlay = new MultiPlayerPlay()
{
CallerPlayerId = inviterUser.Id,
CalledPlayerId = invitedUser.Id,
StillRunning = true,
StillRunningForCaller = true,
StillRunningForCalled = true,
MutantId = GetRandomMutantIdByLevelId(dbContext, inviterUser.Id, invitedUser.Id),
};
dbContext.MultiPlayerPlays.Add(multiPlayerPlay);
dbContext.SaveChanges();