Zac*_* Z. 4 entity-framework ef-code-first entity-framework-4.1
我正在使用基于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; }
}
Run Code Online (Sandbox Code Playgroud)
显然,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"));
Run Code Online (Sandbox Code Playgroud)
但它仍然给我一个关于主键名称的例外.
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.
Run Code Online (Sandbox Code Playgroud)
我有点难过.我需要适应我在EF 4.1中实现的这种非传统结构,只需在可选关系中添加一个唯一的PK并在主表中保存外键关系就容易得多,但我无法更改数据库布局.任何意见,将不胜感激.
我希望我理解得很好.
这对我有用:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这在ZomeMediaTexts表中正确创建了FK_ZoneMediaTexts_ZoneMedias_ZoneMediaID,而外键是主键.
编辑:也许值得指出我正在使用EF 4.3.0
| 归档时间: |
|
| 查看次数: |
5493 次 |
| 最近记录: |