Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Программирование / Programming (https://forum.zone-game.info/forumdisplay.php?f=98)
-   -   c# entity framework (https://forum.zone-game.info/showthread.php?t=42438)

PROGRAMMATOR 28.01.2018 22:06

Re: c# entity framework
 
using (var context = new YourDbContext())
{
	var server = context.Servers.Find(1); // или FindOrDefault с последующей проверкой на null
 
	Response(new YourPacket(server));
}
 
Code: C#

Jopozet 29.01.2018 09:55

Re: c# entity framework
 
Код:

MyDbContext Db = new MyDbContext();
var server = Db.Set<Server>.Where(x => predicate).Select(x => ....)

или

var server = Db.Set<Server>.FirstOrDefault( x => predicate)


Boris2105 08.02.2018 14:04

Re: c# entity framework
 
При попытке брать ид предметов из инвентаря выдает ошибку
ну точнее в инвентарь вызывается предмет из таблицы предметов
Код:

[Error] Unknown column 'c.characterBELTid' in 'field list'
  at MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet(ResultSet resultSet) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 92
  at MySql.Data.MySqlClient.MySqlDataReader.<ReadFirstResultSetAsync>d__65.MoveNext() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 297
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at MySql.Data.MySqlClient.MySqlDataReader.<CreateAsync>d__64.MoveNext() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 287
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at MySqlConnector.Core.TextCommandExecutor.<ExecuteReaderAsync>d__3.MoveNext() in C:\projects\mysqlconnector\src\MySqlConnector\Core\TextCommandExecutor.cs:line 70
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlCommand.cs:line 172
  at Microsoft.EntityFrameworkCore.Storage.Internal.MySqlRelationalCommand.<ExecuteAsync>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at Microsoft.EntityFrameworkCore.Storage.Internal.MySqlRelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary`2 parameterValues)
  at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
  at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.BufferlessMoveNext(Boolean buffer)
  at Microsoft.EntityFrameworkCore.Storage.Internal.MySqlExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
  at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
  at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable`1 source, Boolean& found)
  at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
  at lambda_method(Closure , QueryContext )
  at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass17_1`1.<CompileQueryCore>b__0(QueryContext qc)
  at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
  at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
  at System.Linq.Queryable.First[TSource](IQueryable`1 source, Expression`1 predicate)
  at Project_Sky.PBCoreRE.Database.CharacterDB.loadCharacter(Int32 player_id) in E:\Project\Project_Sky\Project_Sky\Project_Sky.PBCoreRE\Database\CharacterDB.cs:line 13
  at Project_Sky.PBLogin.Emu.Network.Recv.PROTOCOL_LOGIN_REQ.RunImpl() in E:\Project\Project_Sky\Project_Sky\Project_Sky.PBLogin\Emu\Network\Recv\PROTOCOL_LOGIN_REQ.cs:line 38
  at Project_Sky.PBCoreRE.Packet.ClientPacket.Init(Byte[] buffer) in E:\Project\Project_Sky\Project_Sky\Project_Sky.PBCoreRE\Packet\ClientPacket.cs:line 29
  at Project_Sky.PBLogin.Emu.Network.ClientConnection.BeginRead(IAsyncResult asyncResult) in E:\Project\Project_Sky\Project_Sky\Project_Sky.PBLogin\Emu\Network\ClientConnection.cs:line 71

 
public partial class CharacterModel
    {
        public int id { get; set; }
        public int player_id { get; set; }
        public string characterName { get; set; }
        public int characterSlot { get; set; }
        public int selectedCharacter { get; set; }
        public int creationDate { get; set; }
        public int playTime { get; set; }
        public InventoryModel characterPRIMARY { get; set; }
        public InventoryModel characterSECONDARY { get; set; }
        public InventoryModel characterMELEE { get; set; }
        public InventoryModel characterTHROWING { get; set; }
        public InventoryModel characterSPECIAL { get; set; }
        public InventoryModel characterID { get; set; }
        public InventoryModel characterHEAD { get; set; }
        public InventoryModel characterFACE { get; set; }
        public InventoryModel characterJACKET { get; set; }
        public InventoryModel characterPOKET { get; set; }
        public InventoryModel characterGLOVE { get; set; }
        public InventoryModel characterBELT { get; set; }
        public InventoryModel characterHOLSTER { get; set; }
        public InventoryModel characterSKIN { get; set; }
        public InventoryModel characterBERET { get; set; }
        public int skill { get; set; }
        public int skill_level_1 { get; set; }
        public int skill_level_2 { get; set; }
        public int skill_level_3 { get; set; }
        public int skill_slot_1 { get; set; }
        public int skill_slot_2 { get; set; }
        public int skill_slot_3 { get; set; }
        public PlayerModel Player { get; set; }
    }
 
Code: C#

PROGRAMMATOR 08.02.2018 14:27

Re: c# entity framework
 
Пытается получить InventoryModel. Соответственно ищет ключ для связи.

Да и реализация сущности мягко говоря не очень.

Boris2105 08.02.2018 14:32

Re: c# entity framework
 
Цитата:

Сообщение от PROGRAMMATOR (Сообщение 430066)
Пытается получить InventoryModel. Соответственно ищет ключ для связи.

Да и реализация сущности мягко говоря не очень.

и как ему получить?
почему не очень?

PROGRAMMATOR 09.02.2018 01:05

Re: c# entity framework
 
Предметы - собственность аккаунта, один и тот же предмет может быть экипирован у нескольких персонажей. Так что Many-to-Many как раз то, что нужно. Связываешь персонажей и предметы через таблицу character_item, в случае с EF Core 2.0 придётся создать связующую сущность:

class CharacterItem
{
    public int CharacterId { get; set; }
    public Character Character { get; set; }
 
    public int ItemObjId { get; set; }
    public Item Item { get; set; }
}
 
Code: C#

class Character
{
    public ICollection<CharacterItem> CharacterItems { get; set; } 
        = new HashSet<CharacterItem>();
}
 
Code: C#

И это, ты пишешь на C#, а выглядит это всё не как C#. kappa

Если для тебя принципиально важно, чтобы колонки таблиц были в snake_case, то незачем в самих сущностях применять такое написание. Проще в контексте задать необходимый стиль.

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Model.GetEntityTypes()
        .SelectMany(entity => entity.GetProperties())
        .ToList()
        .ForEach(prop => prop.Relational().ColumnName = prop.Name.ToSnakeCase());
}
 
Code: C#

public static string ToSnakeCase(this string value)
{
    return Regex.Replace(value,
            "(.)(?=[A-Z])",
            "$1_",
            RegexOptions.Compiled
        ).ToLower();
}
 
Code: C#


Текущее время: 12:38. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot