具有实体框架的共享图像表

时间:2013-02-07 20:00:46

标签: entity-framework ef-code-first

我想为我的数据库中的图像创建一个表,可以由几个不同的模型使用。我正在使用实体框架并定义了我的图像类,如下所示:

public class Images
{
    public int ID { get; set; }
    public String Name {get; set;}
    public byte[] ImageData { get; set; }  
    public string Type { get; set; }
}

我想从我需要保存图像的任何其他模型链接到此。 E.g

public class Project
{
    public int ID { get; set; }
    public String Name { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    public virtual ICollection<tImages> Images { get; set; }

}

以及

public class User
{
    public int ID { get; set; }
    public String UserName { get; set; }
    public virtual ICollection<tImages> Images { get; set; }
}

问题是实体框架正在为图像表添加项目和用户的外键。我猜想我有点期待。

我想要的是定义一个可用于索引到我的图像表的图像键。我只是不确定如何定义类以获得这种影响。例如,如何定义我的实体类以实现以下结果:

项目表

//ID    Name        StartDate   EndDate     Image
//1     Project1    05/02/2013  06/04/2013  PROJ01IMG

用户表

//ID    UserName    Image       
//1     Bob         USER01IMG       

图像表

//ID  Name          Imagekey    ImageData           Type
//1   img1          PROJ01IMG   0xFFF00F1 .. etc    JPEG
//2   teamphoto     PROJ01IMG   0xFEB0011 ..etc     JPEG
//3   outline       PROJ01IMG   0xFFF0AA3 ..etc     PNG
//4   bob           USER01IMG   0xFFF01233 ..etc    JPEG

当然可能有外键是正确的方法,我不应该担心它?它只是我有很多模型,他们都需要存储图像,所以我宁愿把它们放在一个表而不是多个图像表,因为它会使我想的所有图像的搜索/画廊等更容易。

我觉得这是一个完整的noob问题而且我错过了一些明显的东西,如果它是道歉。

1 个答案:

答案 0 :(得分:1)

如果您不希望EF映射FK,而是根据图像键手动填充列表,请像这样定义您的实体。但是我觉得你用FK的东西会更好。

public class Project
{
    public int ID { get; set; }
    public String Name { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    public string ImageKey { get; set; }
    [NotMapped]
    public List<Image> Images {get; set;}
}

public class User
{
    public int ID { get; set; }
    public String UserName { get; set; }
    public string ImageKey { get; set; }
    [NotMapped]        
    public List<Image> Images {get; set;}
}

我想您可能会尝试定义这样的类,看看它是否符合您的要求:

public class Images
{
    public int ID { get; set; }
    public String Name {get; set;}
    public byte[] ImageData { get; set; }  
    public string Type { get; set; }

    public virtual User User { get; set; }
    public virtual Project Project { get; set; }
}

public class Project
{
    public int ID { get; set; }
    public String Name { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }

}

public class User
{
    public int ID { get; set; }
    public String UserName { get; set; }
}

那应该将FK映射到Project和User中的Images,这是我认为你真正想要的。