1

編集: (簡略化されたソリューション) 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();
}

エラー: このコードによって生成されたクエリは次のとおりです。

Execute Reader "insert [dbo].[Pictures]([Name], [Filename], [URL], [PictureType_Id], [Ad_Id], [PictureType_Id1], [Ad_Id1]) 値 (null, @0, null, @ 1、@2、ヌル、ヌル)"

そして、私はエラーを取得します:

スローされる: 「列名 'PictureType_Id1' が無効です。列名 'Ad_Id1' が無効です。」(System.Data.SqlClient.SqlException) Exception Message = "Invalid column name 'PictureType_Id1'.\r\nInvalid column name 'Ad_Id1'.Exception Type = "System.Data.SqlClient.SqlException", Exception WinRT Data = ""

4

2 に答える 2

1

Ad と Picture の間に 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との関係も持つ必要があるため、 where とPictureの直接関係がありますか?AdAdPicture

これ:

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

    public virtual AdPicture AdPicture { get; set; }
}

またはこれ:

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

    public virtual ICollection<AdPicture> AdPictures { get; set; }
}
于 2013-02-06T14:47:59.993 に答える
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);

他のすべては同じままです。

現在は機能していますが、Ad エンティティと PictureType エンティティを取得するためにデータベースへの往復が 2 回あるため、最適なソリューションではないようです。

私は正しいですか?

于 2013-02-07T02:32:09.153 に答える