【问题标题】:One-to-One in table per hierarchy每个层次结构的表中的一对一
【发布时间】:2014-02-19 17:58:42
【问题描述】:
public class BasePage
{        
    public int Id { get; set; }
    ...
}

public class Region : BasePage
{        
    public virtual MapCoordinates Map { get; set; }
    ...
}

public class Place: BasePage
{        
    public virtual MapCoordinates Map { get; set; }
    ...
}

public class MapCoordinates
{
    [Key, ForeignKey("BasePage")]
    public int Id { get; set; }

    public virtual BasePage BasePage { get; set; }
    ...
}

在 SaveChanges 上获取此异常:

无法确定相关操作的有效顺序。由于外键约束、模型要求或存储生成的值,可能存在依赖关系。

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    使用此代码:

        public class BasePage
        {        
            public int Id { get; set; }
    
            public virtual MapCoordinate Map { get; set; }
            ...
        }
    
        public class Region : BasePage
        {                   
            ...
        }
    
        public class Place: BasePage
        {        
            ...
        }
    
        public class MapCoordinate
        {
            [Key]
            public int BasePageId { get; set; }
            ...
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<BasePage>()
                        .HasRequired(e => e.MapCoordinate)
                        .WithRequiredPrincipal();
    
            modelBuilder.Entity<BasePage>().ToTable(BasePages);
            modelBuilder.Entity<MapCoordinate>().ToTable(MapCoordinates);
        }
    

    查看这些链接:

    Associations in EF Code First: Part 4 – Table Splitting

    Associations in EF Code First: Part 5 – One-to-One Foreign Key Associations

    Code First and Fluent API one to one relationship

    【讨论】:

    • 我不希望BasePage有Map,只有几个派生类应该有。
    • 你想要拆分表吗?
    • 我将 BasePage 及其派生类(Region、Place 等)保存在一张表中,并将 Map 保存在另一张表中。
    • 好的,我认为在 MapCoordinate 中导航到区域和地点而不是 BasePage 并且您不能使用在 basePage 和 MapCoordinate 之间拆分的表,然后在 MapCoordinate 中您必须有两个外键,一个用于区域,一个用于地点。
    • 是的,这可能会起作用,但看起来很丑陋的解决方案,因为事实上我不需要两个外键。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多