Linq-to-sql POCO - вставка завершается неудачно из-за связей NULL - PullRequest
1 голос
/ 07 января 2011

У меня есть таблица «Местоположение», которая имеет отношение внешнего ключа к «Сайту».Я использую linq для sql, чтобы попытаться добавить новую запись местоположения:

Location l = new Location
                 {
                     Description = text,
                     FloorId = 0,
                     IsCurrentLoc = false,
                     LastMove = DateTime.Now,
                     MoveId = 0,
                     SiteId = 1 
                 };

LocationTable.InsertOnSubmit(l);
LocationTable.Context.SubmitChanges();

Однако, когда я пытаюсь сохранить строку местоположения, я вижу эту ошибку:

An attempt was made to remove a relationship between a Site and a Location. However, one of the relationship's foreign keys (Location.SiteId) cannot be set to null.

У меня естьустановить местоположение siteid (идентификатор сайта 1 существует в базе данных).

Мои классы linq-to-sql выглядят так:

[Table(Name = "Locations")]
public class Location
{

    private List<InstallLocation> _InstallLocations = new List<InstallLocation>();


    [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
    internal int LocationId { get; set; }

    [Association(ThisKey = "SiteId", OtherKey = "SiteId", IsForeignKey = true)]        
    public Site Site
    {
        get;
        set;
    }

    [AssociationAttribute(ThisKey = "LocationId", OtherKey = "LocationId")]
    public List<InstallLocation> InstallLocations
    {
        get
        {
            return this._InstallLocations;
        }
        set
        {
            this._InstallLocations = value;
        }
    }

}

РЕДАКТИРОВАТЬ - так что я знаю, почему это происходит, но не как это исправить ...

Благодаря этой записи я теперь вижу, что происходит.Свойство "Сайт" имеет приоритет над идентификатором сайта.Так как я не устанавливаю для Site какое-либо значение, он пытается установить для SiteId значение null, что недопустимо, поэтому происходит сбой.

Что я не совсем понимаю, так это как с этим работать.Я не хочу загружать сущность сайта из базы данных и выполнять удар по БД только для настройки сайта.У меня есть SiteId, и это все, что мне нужно, чтобы сохранить свое «Местоположение».

Есть идеи?

Ответы [ 2 ]

1 голос
/ 07 января 2011

Возможно, вам потребуется реализовать на сайте свойство:

DeleteOnNull="true"

Получено по этой ссылке:

http://blogs.msdn.com/b/bethmassi/archive/2007/10/02/linq-to-sql-and-one-to-many-relationships.aspx

0 голосов
/ 15 февраля 2011

Нашел решение для этого.

По сути, мое исходное сообщение было близко.То, что мне нужно было сделать, это позволить своему внешнему ключу обнуляться в моем классе.Это кажется нелогичным, поскольку в БД его нельзя обнулять, но L2S установит для него значение null, прежде чем позже установить его на правильное значение.:

[Table(Name = "Locations")]
public class Location
{

    [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
    internal int LocationId { get; set; }

    [Column]        
    public int? SiteId { get; set; }

    [Association(ThisKey = "SiteId", OtherKey = "SiteId", IsForeignKey = true)]        
    public Site Site
    {
        get;
        set;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...