EF代码优先:Sequence包含多个匹配元素

时间:2014-12-01 21:10:13

标签: c# entity-framework ef-code-first entity-framework-6

我正在使用EF6代码优先,并且有一个User类需要与其他用户建立传入和传出连接。连接也有属性,所以我也有一个Connections类。

public class User
{
    public int ID { get; set; }

    // Other properties removed here to keep it simple

    [InverseProperty("SourceUser")]
    public virtual ICollection<Connection> OutgoingConnections { get; set; }

    [InverseProperty("DestUser")]
    public virtual ICollection<Connection> IncomingConnections { get; set; }
}

public class Connection
{
    public int ID { get; set; }

    // Other properties removed here to keep it simple

    [InverseProperty("OutgoingConnections")]
    public User SourceUser { get; set; }

    [InverseProperty("IncomingConnections")]
    public User DestUser { get; set; }
}

更新数据库时出现以下错误。最初我没有InverseProperty属性,所以我可以理解为什么EF在这种情况下不知道该怎么做。文档听起来像这些属性是我想要的 - 但它仍然无法正常工作。也许我误解了它。

我希望最终得到一个Users表和一个Connections表,其中Connections表格有IDSourceUserID,{{1} (显然有FK约束)。

有什么想法吗?

  

指定'-Verbose'标志以查看正在应用的SQL语句   到目标数据库。应用显式迁移:   [201411192045091_InitialCreate]。应用显式迁移:   201411192045091_InitialCreate。 System.InvalidOperationException:   Sequence包含多个匹配元素   System.Linq.Enumerable.SingleOrDefault [TSource](IEnumerable DestUserID 2谓词)at at   System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer&LT;&GT; c__DisplayClass250.b__247(小于;&GT; f__AnonymousType2b 1 source, Func 2.MoveNext()
  在System.Linq.Enumerable.WhereSelectEnumerableIterator 2 <>h__TransparentIdentifier242) at System.Linq.Enumerable.WhereSelectEnumerableIterator 1..ctor(IEnumerable 2.MoveNext()
at System.Collections.Generic.List
1 source)at at   System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(ModelMetadata   source,ModelMetadata target,Lazy 1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
1   modificationCommandTreeGenerator,MigrationSqlGenerator   migrationSqlGenerator,String sourceModelVersion,String   targetModelVersion)at   System.Data.Entity.Migrations.DbMigrator.IsModelOutOfDate(的XDocument   model,DbMigration lastMigration)at   System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable的1 modificationCommandTreeGenerator, MigrationSqlGenerator migrationSqlGenerator, String sourceModelVersion, String targetModelVersion) at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(XDocument sourceModel, XDocument targetModel, Lazy 1   pendingMigrations,String targetMigrationId,String lastMigrationId)
  在System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String   targetMigration)   System.Data.Entity.Migrations.DbMigrator&LT;&GT; c__DisplayClassc.b__b()   在   System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(动作   mustSucceedToKeepDatabase)at   System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(动作   mustSucceedToKeepDatabase)at   System.Data.Entity.Migrations.DbMigrator.Update(字符串   targetMigration)   System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(字符串   targetMigration)   System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()   在System.AppDomain.DoCallBack(CrossAppDomainDelegate   callBackDelegate)at   System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
  在System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner)   跑者)   System.Data.Entity.Migrations.Design.ToolingFacade.Update(字符串   targetMigration,Boolean force)at   System.Data.Entity.Migrations.UpdateDatabaseCommand&LT;&GT; c__DisplayClass2&LT; .ctor&GT; b__0()   在   System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(动作   command)Sequence包含多个匹配元素

1 个答案:

答案 0 :(得分:2)

很抱歉,如果要求使用InverseProperties,但如果您可以灵活地以不同方式连接它们,则可以通过这种方式完成关系。

public class User
{
    public int ID { get; set; }

    [ForeignKey("ID")]
    public virtual ICollection<Connection> OutgoingConnections { get; set; }

    [ForeignKey("ID")]
    public virtual ICollection<Connection> IncomingConnections { get; set; }
}

public class Connection
{
    public int ID { get; set; }

    public int SourcerId {get;set;}

    public int DestUserId {get;set;}

    [ForeignKey("SourcerId")]
    public User SourceUser { get; set; }

     [ForeignKey("DestUserId")]
    public User DestUser { get; set; }
}

然后你需要添加配置。在我的情况下测试这个我在上下文中的受保护的覆盖void OnModelCreating(DbModelBuilder modelBuilder)中做了它。

    modelBuilder.Entity<User>().HasMany(x=>x.IncomingConnections).WithRequired(x=>x.SourceUser).WillCascadeOnDelete(false);
    modelBuilder.Entity<User>().HasMany(x => x.OutgoingConnections).WithRequired(x => x.DestUser).WillCascadeOnDelete(false);