2014-12-01 134 views
1

我使用EF6代码优先,并且有一个User类,它需要与其他用户有传入和传出连接。连接也有属性,所以我也有一个Connections类。EF代码优先:序列包含多个匹配元素

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表有IDSourceUserIDDestUserID(很明显,FK约束)。

任何想法?

指定'-Verbose'标志来查看应用到目标数据库的SQL语句 。应用显式迁移: [201411192045091_InitialCreate]。应用显式迁移: 201411192045091_InitialCreate。 System.InvalidOperationException: 序列在 System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer含有 System.Linq.Enumerable.SingleOrDefault [TSource](IEnumerable的1 source, Func 2谓词)多于一个的匹配元素。 <> c__DisplayClass250.b__247(<> f__AnonymousType2b 2 <>h__TransparentIdentifier242) at System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext()
在System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext()
at System.Collections.Generic.List
1..ctor(IEnumerable的1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
1源)在 System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer。 DIFF(ModelMetadata 源,ModelMetadata目标,懒惰 modificationCommandTreeGenerator,migrationSqlGenerator migrationSqlGenerator,字符串sourceModelVersion,字符串 targetModelVersion)在 System.Data.Entity.Migrations.DbMigrator.IsModelOutOfDate(的XDocument 模型,DbMigration lastMigration)在 系统.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable的 pendingMigrations,字符串targetMigrationId,字符串lastMigrationId)
在System.Data.Entity.Migrations.DbMigrator.UpdateInternal(字符串 targetMigration)在 System.Data.Entity的。 Migrations.DbMigrator。 <> c__DisplayClassc.b__b() 在 System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(动作 mustSucceedToKeepDatabase)处 系统 System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(动作 mustSucceedToKeepDatabase)。 Data.Entity.Migrations.DbMigrator.Update(字符串 targetMigration)处 System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(字符串 targetMigration)。运行() at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)at Sys tem.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
at System.Data.Entity.Migrations.Design.ToolingFacade。运行(BaseRunner 转轮)在 System.Data.Entity.Migrations.Design.ToolingFacade.Update(字符串 targetMigration,布尔力)在 System.Data.Entity.Migrations.UpdateDatabaseCommand。 <> c__DisplayClass2。 < .ctor> b__0() 在 System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(动作 命令)序列包含一个以上的匹配元件

+0

http://msdn.microsoft.com/en-us/data/jj591583.aspx有你读这篇文章的代码,第一逆属性 – MethodMan 2014-12-01 21:16:24

+0

是的,这就是我听到我使用的InverseProperty 。也许我错误地阅读它? – Dan 2014-12-01 21:22:51

回答

1

很抱歉,如果使用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; } 
} 

,那么你需要添加配置。在我的情况下,测试这个我在保护覆盖无效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); 
+0

非常好,谢谢! :)不,对InverseProperty没有要求。按照你的例子,这现在工作正常:) – Dan 2014-12-02 08:06:30