一对一关系并删除记录

时间:2012-08-21 17:46:26

标签: asp.net-mvc entity-framework

我将实体框架与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中创建了一个用于引用徽标的字段。

enter image description here

每当我的Project表中有一个引用徽标的项目时,我都会在徽标表中填入Logo_LogoID和相应的键。没关系对我来说。我觉得奇怪的是,当我删除徽标时,sql server会显示以下错误:

enter image description here

因此,为了能够从我的Logo表中删除徽标,我首先需要打破Project表中的引用(通过将Logo替换为NULL),然后从Logo中删除该行。

也许有更好的方式来引用事物?

这似乎是一个愚蠢的问题。

我认为更好的解决方案是使用反向关系:在Logo表中添加ProjectID字段。因此,每当我需要删除徽标时,我都可以轻松删除徽标。

您怎么看?

感谢。

修改

像Mark Oreta建议的那样,我尝试过:

        modelBuilder.Entity<Project>()
            .HasOptional(p => p.Logo)
            .WithOptionalPrincipal(); 

但我得到了ProjectID的双重引用:

enter image description here

知道为什么吗?

1 个答案:

答案 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。

相关问题