首页 文章

如何在EF 4.1代码中首先使用延迟加载和两个表上的相同主键编码可选的一对一关系?

提问于
浏览
4

我正在使用基于ASP / ADO.NET的应用程序和数据结构,我正在将其中的一部分转换为ASP.NET MVC . 在数据结构中,存在“可选的一对一”关系,其中两个表使用相同的主键和名称 . 基本上,这个表可以被认为是主表的“可选扩展” . 以下是模型的示例:

public class ZoneMedia
{
    public int ZoneMediaID { get; set; }
    public string MediaName { get; set; }
    public int Width { get; set; }
    public int Height { get; set; }

    public virtual ZoneMediaText MediaText { get; set; }
}

public class ZoneMediaText
{
    public int ZoneMediaID { get; set; }
    public string Text { get; set; }
    public int Color { get; set; }
}

显然,EF 4.1代码首先会自动映射这个问题 . 所以我意识到我必须明确指定映射 . 我试过这个:

modelBuilder.Entity<ZoneMedia>()
        .HasOptional(zm => zm.ZoneMediaText);

    modelBuilder.Entity<ZoneMediaText>()
        .HasRequired(zmt => zmt.ZoneMedia)
        .WithRequiredDependent(zm => zm.ZoneMediaText)
        .Map(m => m.MapKey("ZoneMediaID"));

但它仍然给我一个关于主键名称的例外 .

Schema specified is not valid. Errors: 
(199,6) : error 0019: Each property name in a type must be unique. Property name     'ZoneMediaID' was already defined.

我有点难过 . 我需要适应这种我在EF 4.1中实现的非常规结构,只需在可选关系中添加一个唯一的PK并在主表中保存外键关系就容易得多,但我无法更改数据库布局 . 任何意见,将不胜感激 .

1 回答

  • 7

    我希望我理解得很好 .

    这对我有用:

    public class ZoneMedia
    {
        public int ZoneMediaID { get; set; }
        public string MediaName { get; set; }
        public int Width { get; set; }
        public int Height { get; set; }
    
        public virtual ZoneMediaText MediaText { get; set; }
    }
    
    public class ZoneMediaText
    {
        public int ZoneMediaID { get; set; }
        public string Text { get; set; }
        public int Color { get; set; }
    
        public virtual ZoneMedia ZoneMedia { get; set; }
    }
    
    public class TestEFDbContext : DbContext
    {
        public DbSet<ZoneMedia> ZoneMedia { get; set; }
        public DbSet<ZoneMediaText> ZoneMediaText { get; set; }
    
        protected override void OnModelCreating (DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<ZoneMedia>()
                .HasOptional(zm => zm.MediaText);
            modelBuilder.Entity<ZoneMediaText>()
                .HasKey(zmt => zmt.ZoneMediaID);
            modelBuilder.Entity<ZoneMediaText>()
                .HasRequired(zmt => zmt.ZoneMedia)
                .WithRequiredDependent(zm => zm.MediaText);
    
            base.OnModelCreating(modelBuilder);
        }
    }
    class Program
    {
        static void Main (string[] args)
        {
            var dbcontext = new TestEFDbContext();
            var medias = dbcontext.ZoneMedia.ToList();
        }
    }
    

    这正确地在ZomeMediaTexts表中创建FK_ZoneMediaTexts_ZoneMedias_ZoneMediaID,并且外键是主键 .

    编辑:也许值得指出我使用的是EF 4.3.0

相关问题