编辑:(简化解决方案) 我不想在可以拥有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 =“”
答案 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
有关系,但Picture
与Ad
有直接关系,因为它与中间表{{}也有关系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实体。
我是对的吗?