.NET Framework EntityFramework не сохраняет вложенную коллекцию Entity, связанную с внешним ключомC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 .NET Framework EntityFramework не сохраняет вложенную коллекцию Entity, связанную с внешним ключом

Сообщение Anonymous »

У меня есть некоторые проблемы с EntityFramework .NET Framework. Мое приложение разработано как таковое: < /p>
Я мой класс, который наследует от dbcontext, и у меня это свойство < /p>
public DbSet Users { get; set; }
...other properties

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);

modelBuilder.Entity()
.HasRequired(umz => umz.User)
.WithMany(u => u.ManageableZones)
.HasForeignKey(umz => umz.Username)
.WillCascadeOnDelete(false);
}
< /code>
Моя пользовательская модель - что -то вроде этого < /p>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Required]
[MaxLength(128)]
[Column("USERNAME")]
public string Username { get; set; } = string.Empty;

public virtual ICollection ManageableZones { get; set; }

public User()
{
ManageableZones = new HashSet();
}
< /code>
Как вы можете видеть, у меня управляемые зоны недвижимости, то есть таблица, с которой я хочу связать, с от 1 до многих отношений. Таким образом, в основном у 1 пользователя может быть много пользовательских управляемыхзонов (для цели в полукоре, зона может быть связана только с 1 пользователем, логически это неверно, но мне не волнуют отношения между многими ко многим)
Это мой пользователь Managablezones < /p>
public virtual User User { get; set; }

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Required]
[Column("ID")]
public int Id { get; set; }

[ForeignKey("User")]
[Required]
[Column("USERNAME")]
public string Username { get; set; }

...other properties

Тогда мне нравится класс, который по сути является проекцией данных моей базы данных
public Class DataContext
{
public List Users {get; set;}

public DataContext()
{
Users = new List();
}
}

DataContext - это «статический» объект, с которым я буду взаимодействовать с данными, добавление/удаление/обновление и так далее. Затем я сохраню эти данные обратно в db < /p>
для этого, у меня класс данных, который в основном инициируйте DataContext, заполнив все свои свойства с помощью данных DB и обновления Данные DB с DataContext One. < /p>
Чтобы сохранить данные в DB, ​​я, IMO, ужасные методы, которые, к сожалению, я не совсем понял, как они работают, поэтому я сделал ' Т действительно когда -либо трогал < /p>
private void SaveTable(List entity, bool canUpdate = true, bool canDelete = true)
where T1 : class
{
PrintCallStack(false);
try
{
AMMContext db;

if (AMMContext.DbType == Entity.eDbType.SqLite)
db = new AMMContext(AMMContext.LoadConnectionString());
else
db = new AMMContext();

using (db)
{
List listInDB = (List)Activator.CreateInstance(typeof(List));
DbSet dbSet = null;
foreach (PropertyInfo pInfo in typeof(AMMContext).GetProperties())
{
if (pInfo.GetValue(db) != null)
{
if (pInfo.GetValue(db).GetType() == typeof(DbSet))
{
dbSet = (DbSet)pInfo.GetValue(db);
listInDB = dbSet.ToList();
}
}
}

List idEntityList = null;
if (entity != null)
idEntityList = entity.Select(y => (T2)GetPrimaryKeyValue(y)).ToList();

//List updating = entity.Where(x => idListinDb.Contains((T2)GetPrimaryKeyValue(x))).ToList();
//List adding = entity.Where(x => !idListinDb.Contains((T2)GetPrimaryKeyValue(x))).ToList();

if (canUpdate)
dbSet.AddOrUpdate(entity.ToArray());

if (canDelete)
{
List deleting = dbSet.ToList().Where(x => !idEntityList.Contains((T2)GetPrimaryKeyValue(x))).ToList();
deleting.ForEach(x => dbSet.Attach(x));
dbSet.RemoveRange(deleting);
}

db.SaveChanges();
}
}
catch (Exception e)
{
try
{

PrintCallStack(true);
Log.ErrorFormat($"DataAccess.Save error, transaction rollback occured | exc:{e.InnerException.InnerException.Message}");
}
catch (Exception ex)
{
Log.ErrorFormat($"DataAccess.Save error, rollback procedure failure");
StringBuilder sb = new StringBuilder();
sb.Append("For entity type : ");
if (entity != null)
{
foreach (T1 item in entity)
{
sb.Append(item.GetType().Name);
sb.Append(" - ");
}
}
Log.ErrorFormat(sb.ToString());
}
}
}
< /code>
Этот метод вызывается DataCcess по всему коду, завернутый в другой метод, который делает что -то вроде этого < /p>
public void Save(bool allFilter = true, bool usersFilter = false, ...other filters)
{

if (ammUsersFilter | allFilter)
SaveTable(entity: DataContext.Users, canUpdate: true, canDelete: !initialConditions);

...same for other filters
}
< /code>
Это все. Проблема заключается в том, что коллекция пользовательских управлений внутри пользователя, она не сохраняется в своей таблице. Как сейчас, когда приложение начинается с нуля, создается БД, а также создается таблица user_zones. Затем загрузите приложение и увидел, что когда данные собираются из БД, у меня действительно есть эта запись внутри пользователя. Это заставляет меня думать, что отношения мудро, моя работа верна. Но я понятия не имею о том, что мне не хватает. < /P>
Ах, просто чтобы упомянуть. Внутри моего пользовательского таблицы я не связан с столбцом с user_zones, но я думаю, что это правильно. Вот и все.CREATE TABLE AMM_USER (
USERNAME VARCHAR(128) NOT NULL,
...
CONSTRAINT PK_AMM_USER PRIMARY KEY (USERNAME)
);

CREATE TABLE USER_ZONES (
ID INTEGER NOT NULL,
USERNAME VARCHAR(128) NOT NULL,
CONSTRAINT PK_USER_ZONES PRIMARY KEY (ID),
CONSTRAINT FK_USER_ZONES_AMM_USER_USERNAME FOREIGN KEY (USERNAME) REFERENCES AMM_USER(USERNAME)
);
CREATE INDEX FK_USER_ZONES_AMM_USER_USERNAME ON USER_ZONES (USERNAME);
CREATE INDEX IX_USER_ZONES_USERNAME ON USER_ZONES (USERNAME);


Подробнее здесь: https://stackoverflow.com/questions/793 ... elated-wit
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»