我正在使用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
表格有ID
,SourceUserID
,{{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__AnonymousType2b1 source, Func
2.MoveNext()
在System.Linq.Enumerable.WhereSelectEnumerableIterator2 <>h__TransparentIdentifier242) at System.Linq.Enumerable.WhereSelectEnumerableIterator
1..ctor(IEnumerable2.MoveNext()
1 source)at at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(ModelMetadata source,ModelMetadata target,Lazy
at System.Collections.Generic.List1 collection)
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的
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 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包含多个匹配元素
答案 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);