EF代码优先:序列包含多个匹配元素 [英] EF code-first: Sequence contains more than one matching element
问题描述
用户
类,需要有到其他用户的传入和传出连接。连接也有属性,所以我也有一个连接
类。 public class User
{
public int ID {get;组; $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $
//删除此处的其他属性以保持简单
[InverseProperty(SourceUser OutgoingConnections {get;组; }
[InverseProperty(DestUser)]
public virtual ICollection< Connection> IncomingConnections {get;组;
}
public class Connection
{
public int ID {get;组;
//其他属性被删除,以保持简单
[InverseProperty(OutgoingConnections)]
public User SourceUser {get;组; }
[InverseProperty(IncomingConnections)]
public User DestUser {get;组; }
}
更新数据库时出现以下错误。最初我没有 InverseProperty
属性,所以我可以理解为什么EF不知道该怎么做。文档听起来像这些属性是我想要的 - 但它仍然不起作用。也许我误会了,但是,我想最终得到一个用户
表,而$ code>连接表,其中连接
表具有 ID
, SourceUserID
, DestUserID
(显然与FK约束)。
任何想法?
指定-Verbose标志,以查看正在应用的SQL语句
到目标数据库。应用明确的迁移:
[201411192045091_InitialCreate]。应用显式迁移:
201411192045091_InitialCreate。 System.InvalidOperationException:
序列包含
上的多个匹配元素System.Linq.Enumerable.SingleOrDefault [TSource](IEnumerable1来源,
2谓词)在
Func
System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer。<> c__DisplayClass250.b__247(<> f__AnonymousType2b2
2.MoveNext()
< h__TransparentIdentifier242 )at
System.Linq.Enumerable.WhereSelectEnumerableIterator
在System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext( )
1..ctor(IEnumerable
在System.Collections.Generic.List1集合)
1源) c $ c> 1 modifyCommandTreeGenerator,
在System.Linq。在
System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(ModelMetadata
source,ModelMetadata target,Lazy <$)中的Enumerable.ToList [TSource](IEnumerable
MigrationSqlGenerator migrationSqlGenerator,String
sourceModelVersion,String ta rgetModelVersion)
System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(XDocument
sourceModel,XDocument targetModel,Lazy 1
modifyCommandTreeGenerator,MigrationSqlGenerator
migrationSqlGenerator,String sourceModelVersion,String
targetModelVersion)
System.Data.Entity.Migrations.DbMigrator.IsModelOutOfDate(XDocument
model,DbMigration lastMigration)at
System.Data.Entity .Migrations.DbMigrator.Upgrade(IEnumerable1
1
pendingMigrations,String targetMigrationId,String lastMigrationId)
at
System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator 。升级(IEnumerable
pendingMigrations,String targetMigrationId,String lastMigrationId)
在System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String
targetMigration )at
System.Data.Entity.Migrations.DbMigrator。<> c__DisplayClassc.b__b()
at
System.Da ta.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action
mustSucceedToKeepDatabase)at
System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action
mustSucceedToKeepDatabase)at
System。 Data.Entity.Migrations.DbMigrator.Update(String
targetMigration)at
System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String
targetMigration)at
System。 Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()
在System.AppDomain.DoCallBack(CrossAppDomainDelegate
callBackDelegate)在
System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
在System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner
runner)at
System.Data.Entity.Migrations.Design.ToolingFacade.Update(String
targetMigration,Boolean force)在
System.Data.Entity.Migrations.UpdateDatabaseCommand。<> c__DisplayClass2。< .ctor> b__0()
at
System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action
命令)序列包含多个匹配元素
对不起,如果使用InverseProperties是一个要求,但如果您有灵活性,可以以不同的方式进行关系。
public class User
{
public int ID {get;组; }
[ForeignKey(ID)]
public virtual ICollection< Connection> OutgoingConnections {get;组; }
[ForeignKey(ID)]
public virtual ICollection< Connection> IncomingConnections {get;组;
}
public class Connection
{
public int ID {get;组; }
public int SourcerId {get; set;}
public int DestUserId {get; set;}
[ForeignKey(SourcerId ]
public User SourceUser {get;组; }
[ForeignKey(DestUserId)]
public User DestUser {get;组; }
}
然后你需要添加配置。在我的情况下,测试这个我在上下文中保护覆盖void OnModelCreating(DbModelBuilder modelBuilder)。
modelBuilder.Entity<使用者>()的hasMany(X => x.IncomingConnections).WithRequired(X => x.SourceUser).WillCascadeOnDelete(假);
modelBuilder.Entity< User>()。HasMany(x => x.OutgoingConnections).WithRequired(x => x.DestUser).WillCascadeOnDelete(false);
I'm using EF6 code-first, and have a User
class that needs to have incoming and outgoing connections to other users. A connection also has properties, so I also have a Connections
class.
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; }
}
I'm getting the following error when updating my database. Initially I didn't have the InverseProperty
attributes, so I can understand why EF didn't know what to do in that case. The documentation sounds like these attributes are what I want though - but it's still not working. Perhaps I'm misunderstanding it though.
I want to end up with a Users
table, and a Connections
table where the Connections
table has ID
, SourceUserID
, DestUserID
(obviously with FK constraints).
Any ideas?
Specify the '-Verbose' flag to view the SQL statements being applied to the target database. Applying explicit migrations: [201411192045091_InitialCreate]. Applying explicit migration: 201411192045091_InitialCreate. System.InvalidOperationException: Sequence contains more than one matching element at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable
1 source, Func
2 predicate) at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.<>c__DisplayClass250.b__247(<>f__AnonymousType2b2 <>h__TransparentIdentifier242) at System.Linq.Enumerable.WhereSelectEnumerableIterator
2.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()
1..ctor(IEnumerable
at System.Collections.Generic.List1 collection)
1 source) at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(ModelMetadata source, ModelMetadata target, Lazy
at System.Linq.Enumerable.ToList[TSource](IEnumerable1 modificationCommandTreeGenerator, MigrationSqlGenerator migrationSqlGenerator, String sourceModelVersion, String targetModelVersion) at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(XDocument sourceModel, XDocument targetModel, Lazy
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(IEnumerable1 pendingMigrations, String targetMigrationId, String lastMigrationId)
1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable
at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration) at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.b__b() at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration) at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run() at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner) at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force) at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0() at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command) Sequence contains more than one matching element
Sorry if using InverseProperties is a requirement but the relationships can be done this way if you have the flexibility to wire them up differently.
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; }
}
then you need to add configurations. In my case to test this I did it in protected override void OnModelCreating(DbModelBuilder modelBuilder) in the context.
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);
这篇关于EF代码优先:序列包含多个匹配元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!