« first day (754 days earlier)      last day (2277 days later) » 

10:00 AM
@alexolut почему при добавлении элемента могут добавлять еще все на которые он ссылается, хотя они уже были в бд??? // @PashaPash, @PavelMayorov
 
@Grundy контекст, в котором получены те элементы один и тот же?
 
@Андрей это создание нового элемента, то есть он получается без контекста, а при сохранении что-то вроде такого:
    using (var db = new MyDbContext())
    {
        userGroup = db.UserGroups.Add(userGroup);
        db.SaveChanges();
        return userGroup;
    }
 
@Grundy надо значит сначала прикрепить к контексту (я про те, на которые он ссылается)
@Grundy ну да, вы новый контекст создаете, т.е. все элементы надо к нему прикреплять
 
@Андрей через какой-нибудь attach?
 
@Grundy типа того
 
10:11 AM
@Андрей тут просто еще класс сам на себя ссылается:
    public class UserGroup
    {
        [Key]
        public int UserGroupId { get; set; }

        public int Parent_UserGroupId { get; set; }


        public  UserGroup ParentGroup { get; set; }
        public List<UserGroup> ChildGroups { get; set; }

        public string UserGroupName { get; set; }
    }
поэтому неизвестно что прикреплять :-)
 
@Grundy можно еще попробовать перегрузить у них GetHashCode и Equals, чтобы они для EF видились одним и тем же независимо от контекста, но я хз на сколько это правильно
 
@Андрей а он разве не должен смотреть на поле которое [Key] помечено?
и уже по нему определять одинаковость
 
@Grundy нет
Но вы можете заставить его это делать, если напишете GetHashCode и Equals, которые будут ваш кей смотреть
 
@Андрей хе-хе, Attach сработал, спасибо
 
@Grundy потому что у них статус в контексте Added или Detached
 
10:18 AM
@PavelMayorov именно поэтому аттач сработал?
 
@Grundy да, именно потому
@Grundy у вас трехзвенная архитектура?
 
@PavelMayorov в смысле? :-)
 
Если нет, то есть способ проще чем Attach.
 
@PavelMayorov как например?
 
надо просто загружать записи из базы в том же самом контексте где потом другие записи сохраняются.
Иными словами, реже закрывать контекст.
 
10:20 AM
@PavelMayorov а, не, у нас пока сделали - создание и соответственно открытие контекста на каждую операцию
то есть не получится просто создать один раз контекст, и внутри него все делать
 
@Grundy Да, по поводу [Key]. Он так и смотрит... но только для записей в статусе Unchanged, Modified и Deleted :-)
 
@PavelMayorov вот блин :-) как все сложно
 
@Grundy наоборот, все просто. Если запись не была загружена из базы - то откуда у нее может быть ключ?
 
@PavelMayorov и это надо делать на все свойства в объект?
если например на два или три ссылка идет?
 
@Grundy в смысле?
А, вы про Attach? Да.
 
10:25 AM
@PavelMayorov да, я про attach :)
жесть...
 
@Grundy достаточно по идее var entity = new Entity { Id = 10 } и потом Attach
 
Но есть способ проще: не заполнять эти поля.
 
@PavelMayorov а как их потом добавить тогда?
@Андрей ну attach То все равно надо
 
@Grundy Ну можно же просто заполнить внешние ключи.
 
@PavelMayorov эм, как @Андрей сказал entity.foreign = new Foreign { Id = 10 }?
 
10:28 AM
@Grundy нет. Вот так проще же: entity.foreignId = 10
 
@PavelMayorov а если нет поля foreignId :) есть только объект foreigh, который null
 
@Grundy а зачем вы так сделали? :-)
 
@PavelMayorov так-то делал не я :-)
 
@Grundy так переделайте...
 
@PavelMayorov :-D а на что? :-) чтобы было и объект и поле для его id?
 
10:32 AM
@Grundy а почему бы и нет?
 
@PavelMayorov а сам объект надо объявлять как virtual?
 
@PavelMayorov я потому и спрашиваю что без понятия как там вообще должно было работать все :):):)
@PavelMayorov, а вот в таком классе это как может выглядеть?
    public class UserGroup
    {
        [Key]
        public int UserGroupId { get; set; }

        public  UserGroup ParentGroup { get; set; }
}
 
10:45 AM
@Grundy public int? ParentGroupId {get; set;}
 
@PavelMayorov а как его связать с сами свойством? он сейчас две колонки создает ParentGroupId и ParentGroup_UserGroupId
 
@Grundy хм, странно, вроде же должен был сам связать по соглашению...
Тогда поставь атрибут ForeignKeyAttribute
 
пробовал ParentGroup_UserGroupId называть, но тогда две колонки такие ParentGroup_UserGroupId и ParentGroup_UserGroupId1
@PavelMayorov а где он лежит? у меня почему-то студия не находит его
 
@Grundy System.ComponentModel.DataAnnotations.dll
 
@PavelMayorov почему-то в той dll что подключена - нет такого атрибута :)
там только Key
 
 
2 hours later…
12:41 PM
63 messages moved from Stack Overflow на русском
 
12:52 PM
@Grundy версия .NET?\
Написано с 4,5 доступно: msdn.microsoft.com/ru-ru/library/…
 
@Андрей 4 target вроде как
 
1:14 PM
Хм, у вас таблица ссылается сама на себя же...
Ну у меня это корректно работает и без аннотаций:
public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ParentId { get; set; }
    public User Parent { get; set; }
}
 
1:32 PM
@Grundy Ага, а это уже не работает:
public class User
{
    public int UserId { get; set; }
    public string Name { get; set; }
    public int? ParentId { get; set; }
    public User Parent { get; set; }
}
Создает также как и у вас ParentId (этот при чем не является ключом) и Parent_UserId
А это снова работает:
public class User
{
    public int UserId { get; set; }
    public string Name { get; set; }
    public int? ParentUserId { get; set; }
    public User Parent { get; set; }
}
 
@Андрей а у меня не работало
 
Т.е. получается нужно полностью дописывать имя ключевого поля, чтобы он цеплял
@Grundy в вашем случае придется писать что-то типа такого:
public int? ParentGroupUserGroupId { get; set; }
Или, лучше, первичный ключ обозвать просто Id
 
 
1 hour later…
3:00 PM
@Андрей пока остановились на использовании Attach :)
 

« first day (754 days earlier)      last day (2277 days later) »