0

我首先使用带有 ASP.NET MVC3 代码的实体框架。

我有一个这样的项目实体和徽标:

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 表中断开引用(通过将 LogoID 替换为 NULL),然后从 Logo 中删除该行。

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

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

我认为更好的解决方案是具有反向关系:在 Logo 表中添加 ProjectID 字段。所以每当我需要删除一个标志时,我都可以轻松地删除这个标志。

你怎么看?

谢谢。

编辑

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

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

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

在此处输入图像描述

知道为什么吗?

4

1 回答 1

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。

于 2012-08-21T18:10:26.970 回答