我将实体框架与ASP.NET MVC3 Code First一起使用。
我有一个项目实体和徽标,如下所示:
public class Project
{
[Key]
public int ProjectID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual Logo Logo { get; set; }
}
public class Logo
{
[Key]
public int LogoID { get; set; }
public string LogoName { get; set; }
public byte[] LogoContent { get; set; }
public string LogoContentType { get; set; }
}
每个项目可以附加0或1个徽标。
创建我的数据库(sql server)后,我看到在表Project中创建了一个用于引用徽标的字段。
每当我的Project表中有一个引用徽标的项目时,我都会在徽标表中填入Logo_LogoID和相应的键。没关系对我来说。我觉得奇怪的是,当我删除徽标时,sql server会显示以下错误:
因此,为了能够从我的Logo表中删除徽标,我首先需要打破Project表中的引用(通过将Logo替换为NULL),然后从Logo中删除该行。
也许有更好的方式来引用事物?
这似乎是一个愚蠢的问题。
我认为更好的解决方案是使用反向关系:在Logo表中添加ProjectID字段。因此,每当我需要删除徽标时,我都可以轻松删除徽标。
您怎么看?
感谢。
修改
像Mark Oreta建议的那样,我尝试过:
modelBuilder.Entity<Project>()
.HasOptional(p => p.Logo)
.WithOptionalPrincipal();
但我得到了ProjectID的双重引用:
知道为什么吗?
答案 0 :(得分:0)
您可以使用以下方法覆盖DbContext中的OnModelCreating来更改映射:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Project>()
.HasOptional(p => p.Logo)
.WithOptionalPrincipal();
}
这将在您的Logo实体上创建一个Project_ProjectID。
如果你想自定义名字 - 你说你没关系,但是你可能想稍后更改它,你可以把它添加到最后:
.Map(m => m.MapKey("ProjectId")
它将映射到Logo实体上的ProjectId。