简体   繁体   English

EF引用同一类型的多个属性

[英]EF multiple properties referencing same type

I'm trying to link a list of subs and a main sub for a video object with cascade on delete. 我正在尝试使用删除时的级联链接视频对象的子列表和主子列表。

I found some pages explaining how to do this for 2 single objects to the same type. 我找到了一些页面,说明如何对2个相同类型的单个对象执行此操作。 But not for a list and a single object. 但不适用于列表和单个对象。
How can I set up two navigation properties of the same type in Entity Framework 如何在Entity Framework中设置两个相同类型的导航属性

Here is my code: 这是我的代码:

using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;

namespace DataAccess
{
    public class SimpleVideo
    {
        public string Name { get; set; }
        public int SimpleVideoId { get; set; }
        public virtual List<Sub> Subs { get; set; }
        public Sub MainSub { get; set; }
    }

    public class Sub
    {
        public int SubId { get; set; }
        public string Language { get; set; }
    }

    class VideoContext : DbContext
    {
        public DbSet<SimpleVideo> SimpleVideos { get; set; }
        public DbSet<Sub> Subs { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            Database.SetInitializer(new DropCreateDatabaseAlways<VideoContext>());

            modelBuilder.Entity<SimpleVideo>().HasMany(v => v.Subs).WithOptional().WillCascadeOnDelete(true);
            modelBuilder.Entity<SimpleVideo>().HasOptional(v => v.MainSub).WithRequired().WillCascadeOnDelete(true);

            base.OnModelCreating(modelBuilder);
        }
    }
}

I can't get this to work. 我无法使它正常工作。 when i enable just one of the modelBuilder lines, it works. 当我仅启用modelBuilder行之一时,它就可以工作。 How do i get both of them to work at the same time? 我如何让他们同时工作?

System.Data.SqlServerCe.SqlCeException was unhandled
  HResult=-2147467259
  Message=The referential relationship will result in a cyclical reference that is not allowed. [ Constraint name = FK_dbo.Subs_dbo.SimpleVideos_SubId ]
  Source=SQL Server Compact ADO.NET Data Provider
  ErrorCode=-2147467259
  NativeError=25083
  StackTrace:
       at System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr)
       at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommandText(IntPtr& pCursor, Boolean& isBaseTableCursor)
       at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior behavior, String method, ResultSetOptions options)
       at System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery()
       at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement)
       at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement)
       at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements)
       at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements)
       at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable`1 operations, Boolean downgrading, Boolean auto)
       at System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading)
       at System.Data.Entity.Migrations.Infrastructure.MigratorBase.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading)
       at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
       at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
       at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
       at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update()
       at System.Data.Entity.Internal.DatabaseCreator.CreateDatabase(InternalContext internalContext, Func`3 createMigrator, ObjectContext objectContext)
       at System.Data.Entity.Internal.InternalContext.CreateDatabase(ObjectContext objectContext)
       at System.Data.Entity.Database.Create(Boolean skipExistsCheck)
       at System.Data.Entity.Database.Create()
       at System.Data.Entity.DropCreateDatabaseAlways`1.InitializeDatabase(TContext context)
       at System.Data.Entity.Database.<>c__DisplayClass2`1.<SetInitializerInternal>b__0(DbContext c)
       at System.Data.Entity.Internal.InternalContext.<>c__DisplayClass8.<PerformDatabaseInitialization>b__6()
       at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)
       at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()
       at System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c)
       at System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input)
       at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action)
       at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()
       at System.Data.Entity.Internal.InternalContext.Initialize()
       at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
       at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
       at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
       at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
       at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)
       at System.Data.Entity.DbSet`1.Add(TEntity entity)
       at DataAccess.Program.Main() in c:\MMProject\TestProjects\DataAccess\Program.cs:line 63
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

Take a look at this post of mine dealing with the exact same structure (as far as I can tell)... 看看我的这篇文章处理的结构完全相同 (据我所知)...
Entity Framework One-to-Many with Default 实体框架一对多(默认)

I didn't test this - so just replaced names - this should work I think... 我没有对此进行测试-所以只是替换名称-我认为这应该可以工作...

modelBuilder.Entity<SimpleVideo>()
    .HasOptional(x => x.MainSub)
    .WithOptionalPrincipal() // x => x.DefaultForEntity)
    .WillCascadeOnDelete(true);

You don't need the other one relationship - cascade is on by default. 您不需要其他关系-默认情况下,层叠处于启用状态。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在EF7中添加相同类型的多个导航属性 - Adding multiple navigation properties of the same type in EF7 EF CORE 映射到同一个表的多个属性 - EF CORE multiple properties that map to the same table EF中多个成员的相同类型之间的自引用关联 - Self referencing association between same types in EF for multiple members EF映射同一表的多个属性。 未加载关系“”,因为类型“”不可用 - EF Mapping multiple properties same table. The relationship '' was not loaded because the type '' is not available EF 5-6.1.1中的NullReferenceException,具有两个相同类型的导航属性 - NullReferenceException in EF 5-6.1.1 with two navigation properties to the same type EF Core 多个导航属性与流利的 api 相同的表 - EF Core multiple navigation properties to same table with fluent api 具有TPH继承的实体类型到多个表的EF映射属性 - EF Mapping Properties of an Entity Type to Multiple Tables with TPH Inheritance 相同类型的多个导航属性的关系配置? - Relashionship configuration of multiple navigation properties of same type? EF Core 6 的多级属性 - Multiple level properties with EF Core 6 EF6代码优先-自引用配置导航属性 - EF6 Code First - Self-referencing configure navigation properties
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM