没有代码优先模型创建的一对多关系实体框架

时间:2013-02-06 11:10:41

标签: c# asp.net-mvc entity-framework

编辑:(简化解决方案) 我不想在可以拥有N个图片的广告实体中插入图片实体。 图片与广告有关。

广告模型:

public class  Ad
{
    public int Id { get; set; }
    public string Title { get; set; }

    public virtual ICollection<Picture> Pictures { get; set; }
}

图片模型:

public class Picture
{
    public int Id { get; set; }
    public string URL { get; set; }

    public int Ad_Id { get; set; }
    public virtual Ad Ad { get; set; }

    public int PictureType_Id { get; set; }
    public virtual PictureType PictureType { get; set; }
}

PictureType型号:

public class PictureType
{
    public int Id { get; set; }
    public string Name { get; set; }
}

广告服务:

Picture picture = new Picture()
{
    Ad_Id = adId,
    Filename = newFileName,
    PictureType_Id = pictureType.Id
};

_pictureService.CreatePicture(picture);

图片服务:

public void CreatePicture(Picture picture)
{
    _pictureRepository.Add(picture);
    _pictureRepository.Save();
}

错误: 此代码生成的查询是:

执行阅读器“插入[dbo]。[图片]([名称],[文件名],[URL],[PictureType_Id],[Ad_Id],[PictureType_Id1],[Ad_Id1]) values(null,@ 0,null,@ 1,@ 2,null,null)“

我得到了错误:

抛出:“无效的列名'PictureType_Id1'。 列名称'Ad_Id1'无效。“(System.Data.SqlClient.SqlException)异常消息=”无效的列名称'PictureType_Id1'。\ r \ n无效的列名'Ad_Id1'。 Exception Type =“System.Data.SqlClient.SqlException”,Exception WinRT Data =“”

2 个答案:

答案 0 :(得分:1)

您错过了广告与图片之间的PK / FK关系。默认值为Ad_Id

public class Picture
{
    public int Id { get; set; }
    public string URL { get; set; }

    public int Ad_Id { get; set; }
    public virtual Ad Ad { get; set; }
}

您的数据库需要相同的内容。

需要在实体之间定义关系(类似这样)

this.HasMany(c => c.AdPictures)
    .WithRequired(p => p.Ad)
    .HasForeignKey(k => k.Ad_Id);

根据附加信息,问题似乎是:

Ad与中间表AdPicture有关系,但PictureAd有直接关系,因为它与中间表{{}也有关系1}}?

这样:

AdPicture

或者这个:

public class Picture
{
    public int Id { get; set; }
    public string URL { get; set; }

    public virtual AdPicture AdPicture { get; set; }
}

答案 1 :(得分:0)

这有意义吗? :

图片模型的变化:

public class Picture
{
    // Primary properties
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Filename { get; set; }
    public string URL { get; set; }

    // Navigation properties
    //public int PictureType_Id { get; set; }
    public virtual PictureType PictureType { get; set; }

    //public int Ad_Id { get; set; }
    public virtual Ad Ad { get; set; }
}

广告服务更改:

// Insert Picture 
Picture picture = new Picture()
{
    Ad = _adRepository.GetById(adId),
    Filename = newFileName,
    PictureType = _pictureTypeService.GetPictureTypeById(pictureType.Id)
};

_pictureService.CreatePicture(picture);

其他一切都保持不变。

现在它正在运行,但它似乎不是最好的解决方案,因为我有2次往返数据库以获取Ad实体和PictureType实体。

我是对的吗?